2

继承的类 C2 流序列化后如下所示:

0x5a 0x03

0x08 0x97 0x01

0x08 0x96 0x01

我不明白那是第一组字节(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);
    }
4

1 回答 1

2
  • 0x5a = field-number 11,wire-type 2(长度前缀) - 这表示通过将子类封装为内部消息的继承
  • 0x03 = 3(有效载荷长度)
    • 0x08 = 字段 1,线型 0 (varint)
    • 0x97 0x01 = 151(varint = little-endian 使用 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 回答