2013-03-11 37 views
1

使用protogen生成的類的默認值在UseImplicitZeroDefaults = false時似乎沒有被序列化。UseImplicitZeroDefaults用於生成的protobuf類

我有一個小.proto文件:

package protobuf; 

option java_package = "com.company.protobuf"; 
option java_outer_classname = "Test"; 

message TestMessage{   
    optional string Message = 1; 
    optional bool ABool = 2; 
    optional int32 AnInt = 3;   
} 

使用protogen.exe,我已經產生了TestMessage類,我試圖來回發送跨線到Java應用程序。我似乎無法獲得protobuf-net將AnInt的值設爲零或ABool設爲false,包括設置UseImplicitZeroDefaults=false。但是,使用該設置使用帶註釋的類進行序列化是有效的。下面是一個等價類,我產生一個:

[ProtoContract] 
class Test2 
{ 
    [ProtoMember(1)] 
    public string Message { get; set; } 
    [ProtoMember(2)] 
    public bool ABool { get; set; } 
    [ProtoMember(3)] 
    public int AnInt { get; set; } 
} 

初始化兩個具有相同的數據和序列化到byte[]顯示,四個額外的字節從註釋類的到來。

... 
private static readonly RuntimeTypeModel serializer; 
static Program() 
{ 
    serializer = TypeModel.Create(); 
    serializer.UseImplicitZeroDefaults = false; 
    Console.WriteLine(serializer.UseImplicitZeroDefaults); //prints false 
} 

static void SendMessages(ITopic topic, ISession session) 
{ 
    Console.WriteLine(serializer.UseImplicitZeroDefaults); 

    TestMessage t = new TestMessage(); 
    t.ABool = false; 
    t.AnInt = 0; 
    t.Message = "Test Message"; 

    using (var o = new MemoryStream()) 
    { 
     serializer.Serialize(o, t); 
     Console.WriteLine(string.Format("Tx: Message={0} ABool={1} AnInt={2}", t.Message, t.ABool, t.AnInt)); 
     Console.WriteLine(o.ToArray().Length); 
    } 

    Test2 t2 = new Test2(); 
    t2.ABool = false; 
    t2.AnInt = 0; 
    t2.Message = "Test Message"; 
    using (var o = new MemoryStream()) 
    { 
     serializer.Serialize(o, t2); 
     Console.WriteLine(string.Format("Tx: Message={0} ABool={1} AnInt={2}", t.Message, t.ABool, t.AnInt)); 
     Console.WriteLine(o.ToArray().Length); 
    } 
} 

輸出:

False 
Tx: Message=Test Message ABool=False AnInt=0 
14 
Tx: Message=Test Message ABool=False AnInt=0 
18 

是有我丟失的設置?或者.proto文件生成的類使用不同的序列化機制?在理想的世界中,我期望UseImplicitZeroDefaults設置在通過序列化程序的過程中被註釋和生成的類所提取。

回答

1

如果您將-p:detectMissing添加到您撥打protogen的電話,它應該發出遵循不同模式的代碼,以便更好地跟蹤這些代碼。基本上,它應該做你想要的東西。

+0

工作。我瞭解了可空類型。謝謝。 – dmcauslan 2013-03-11 19:42:03

相關問題