使用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
設置在通過序列化程序的過程中被註釋和生成的類所提取。
工作。我瞭解了可空類型。謝謝。 – dmcauslan 2013-03-11 19:42:03