[英]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.