1

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の値をシリアル化することができないようです。ただし、その設定でシリアル化に注釈付きクラスを使用することはできます。これが私が生成したものと同等のクラスです:ABoolUseImplicitZeroDefaults=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理想的な世界では、シリアライザーを通過する途中で、注釈付きのクラスと生成されたクラスの両方によって設定が取得されることを期待します。

4

1 に答える 1

1

-p:detectMissingへの呼び出しに追加するprotogenと、これらをより適切に追跡できるようにする別のパターンに従ってコードを出力する必要があります。基本的に、それはあなたが望むことをするはずです。

于 2013-03-11T19:21:02.153 に答える