protogenで生成されたクラスのデフォルト値は、の場合はシリアル化されていないようですUseImplicitZeroDefaults = false
。
私は小さな.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
またはfalseの値をシリアル化することができないようです。ただし、その設定でシリアル化に注釈付きクラスを使用することはできます。これが私が生成したものと同等のクラスです:ABool
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; }
}
同じデータで2つのクラスを初期化し、にシリアル化すると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
理想的な世界では、シリアライザーを通過する途中で、注釈付きのクラスと生成されたクラスの両方によって設定が取得されることを期待します。