2017-04-25 112 views
1

Proto3 C# Reference包含以下文本:可以通過協議緩衝區發送可空類型嗎?

包裝類型字段

大多數proto3著名的類型不影響代碼生成, 但包裝類型(StringWrapper,Int32Wrapper等)更改 類型和屬性的行爲。

所有對應於C#的值類型 (Int32WrapperDoubleWrapperBoolWrapper等)的包裝類型都映射到 Nullable<T>其中T是相應的非空類型。例如,對於 示例,類型DoubleValue的字段會生成類型爲 Nullable<double>的C#屬性。產生

StringWrapper型或BytesWrapper結果在C#屬性string類型的 和ByteString的字段,但與null默認 值,並且允許null要被設置爲屬性值。

對於所有包裝類型,空值,所以在重複 字段允許的,但被允許作爲用於映射條目的值。

當試圖生成從.proto文件.cs文件,如果我嘗試在.proto文件中聲明一個字段作爲Int32Wrapper,protoc.exe拋出約Int32Wrapper不存在錯誤。

syntax ="proto3"; 
package prototest; 
import "MessageIdentifier.proto"; 


message TestMessage { 
    string messageTest = 1; 
    fixed64 messageTimestampTicks = 2; 
    uint32 sequenceNumber = 3; 
    MessageUniqueID uniqueID = 4; 
    Int32Wrapper nullableInt = 5; 
} 

看來還有一些額外的步驟在這裏丟失,有誰知道如何啓用這些類型?

+1

聲明一個領域是模糊的,你定義原型文件並生成C#類或C#類定義的字段,並試圖產生一個原型?一個簡單的例子可能有助於澄清。 – Guvante

+0

@Guvante我正嘗試使用protoc.exe從.proto文件生成.cs文件。我編輯了我的問題來添加更多的細節和例子.proto文件。 – pquest

+1

奇怪我無法找到該網頁外約Int32Wrapper任何相關的文檔和測試案例的protobuf:https://github.com/google/protobuf/blob/master/src/google/protobuf/util/internal/testdata/ wrappers.proto – Guvante

回答

0

您需要導入谷歌/的protobuf/wrappers.proto爲了這個工作。

syntax ="proto3"; 
package prototest; 
import "MessageIdentifier.proto"; 
import "google/protobuf/wrappers.proto"; 

message TestMessage { 
    string messageTest = 1; 
    fixed64 messageTimestampTicks = 2; 
    uint32 sequenceNumber = 3; 
    MessageUniqueID uniqueID = 4; 
    google.protobuf.Int32Wrapper nullableInt = 5; 
} 

然後你可以用它作爲int嗎?如nullableInt.HasValue和nullableInt.Value