UseImplicitZeroDefaults = false
时,使用protogen生成的类的默认值似乎没有序列化。
我有一个小的.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[]
表明有4个额外字节来自带注释的类。
...
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
设置能够通过序列化程序在注释和生成的类中被拾取。
答案 0 :(得分:1)
如果您在调用-p:detectMissing
时添加protogen
,则应按照不同的模式发出代码,以便更好地跟踪这些代码。基本上,它应该做你想要的。