继承类protobuf-net序列化

时间:2012-12-13 18:41:02

标签: protobuf-net

继承类C2流序列化之后看起来像:

0x5a 0×03

0x08的 0x97 0×01

0x08的 0x96 0×01

我无法理解那是第一组字节(5a 03)?我认为它必须是第二个和第三个,它们代表Z1和Z2值?

我的代码:

    [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);
    }

1 个答案:

答案 0 :(得分:2)

  • 0x5a = field-number 11,wire-type 2(length prefixed) - 这表示通过将子类封装为内部消息的继承
  • 0x03 = 3(有效载荷长度)
    • 0x08 =字段1,wire-type 0(varint)
    • 0x97 0x01 = 151(varint =使用MSB作为延续的little-endian)
  • 0x08 =字段编号1,线型0(varint)
    • 0x96 0x01 = 150

基本上映射到(in​​ .proto)

message C1 {
    optional int32 Z1 = 1;
    optional C2 c2 = 11;
}
message C2 {
    optional int32 Z2 = 1;
}