2013-03-11 60 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