2

継承されたクラス C2 ストリームのシリアル化後は、次のようになります。

0x5a 0x03

0x08 0x97 0x01

0x08 0x96 0x01

それが最初のバイト グループ (5a 03) であることがわかりませんか? Z1とZ2の値を表しているのは2番目と3番目だけであるに違いないと思いましたか?

私のコード:

    [ProtoContract]
    class C1
    {
        [ProtoMember(1, DataFormat = DataFormat.Default)]
        public int Z1 { get; set; }
    }

    [ProtoContract]
    class C2 : C1
    {
        [ProtoMember(1, DataFormat = DataFormat.Default)]
        public int Z2 { get; set; }
    }      

    public static void Main()
    {
        MemoryStream stream = new MemoryStream();
        ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(C1), true).AddSubType(11, typeof(C2));
        C2 c2 = new C2() {Z1 = 150, Z2 = 151};           
        Serializer.Serialize(stream, c2);
    }
4

1 に答える 1

2
  • 0x5a =フィールド番号11、ワイヤタイプ2(プレフィックス付きの長さ)-これは、サブクラスを内部メッセージとしてカプセル化することによる継承を表します
  • 0x03 = 3(ペイロードの長さ)
    • 0x08 =フィールド1、ワイヤータイプ0(varint)
    • 0x97 0x01 = 151(varint = MSBを継続として使用するリトルエンディアン)
  • 0x08 =フィールド番号1、ワイヤタイプ0(varint)
    • 0x96 0x01 = 150

これは基本的に(.protoで)にマップされます

message C1 {
    optional int32 Z1 = 1;
    optional C2 c2 = 11;
}
message C2 {
    optional int32 Z2 = 1;
}
于 2012-12-13T19:54:09.060 に答える