簡體   English   中英

protobuf-net是否缺少可選字段的has_函數?

[英]protobuf-net missing has_ function for optional fields?.

我們使用協議緩沖區在本機C ++應用程序之間進行通信,也使用本機C ++應用程序與.NET應用程序(全部為VS2012)之間通過protobuf-net r666進行通信。 在C ++中,我們嚴重依賴於可用於可選元素的has_函數。

例如,如果我們有一條帶有可選布爾值的消息,則可能是未設置,將其設置為true或將其設置為false。

在C ++中,可以使用has_field函數進行檢查,如果已設置,則可以使用get_field函數獲取內容。 如果未設置,則調用get_field,則get返回默認值,如果未顯式設置,則默認值為false(用於布爾值)。

這在C ++中可以完美運行,但是在protobuf-net中,我們似乎無法找到has_函數的等效項,並且在收到消息后,將字段添加到消息中,並將其內容設置為默認值,是假的。 缺省情況下該字段存在不是什么麻煩,但問題是沒有has_函數檢查消息中是否設置了該字段。

請告知這是一個錯誤還是我們錯過了protobuf-net中的某些東西,並且實際上這是可能的

提前謝謝。 維姆

(我知道我們已經在問題跟蹤器中介紹了此內容-純粹是為了提高可見性等)

這涉及從.proto文件生成類,對於protobuf-net而言,這是通過protogen工具生成的。 默認情況下,它不會創建等效的has_*方法,但是可以使用-p:detectMissing開關啟用它-這將導致它創建*Specified訪問器。 這里的命名是.NET慣用語,帶有*Specified可以被其他.NET序列化程序和內部代碼識別。 它還會生成一個私有的ShouldSerialize*方法,該方法再次可以幫助一些內部.NET代碼。

在這種特定情況下,存在一個名為value的成員引起的第二個問題,引起混亂; csharp.xslt文件現在已更新,可以解決此問題。


更新:在完全托管的重寫中,當使用proto2語法(默認設置)時,默認情況下會生成ShouldSerialize*()方法。 不需要其他參數。 添加*Specified成員(除ShouldSerialize*()之外,它沒有其他目的。

請注意,使用proto3 ,對序列化規則的更改意味着該概念不再有意義。 當且僅當該值不是默認值(始終為null / false /零/空)時,才會序列化該值。 沒有“默認值但已指定”的概念。 因此, ShouldSerialize*()方法通常不再有用,並且不會生成。 我願意選擇為proto3生成它們,如果可以幫助某些真正的編碼方案,它們的基本含義是“非默認值”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM