2012-12-13 85 views
2

繼承類C2流的序列化後看起來像這樣:繼承類protobuf網系列化

0x5a ×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); 
    } 

回答

2
  • 0x5a =場數11,線2型(長度爲前綴) - 這代表通過子類作爲內的消息
  • ×03的封裝的繼承= 3(有效載荷的長度)
    • 0x08的=字段1,線型0(varint)
    • 0x97 0×01 = 151(varint使用MSB作爲延續=小端)
  • 0x08的=字段號1,線型0(varint)
    • 0x96 0×01 = 150

基本上映射到(在.proto)

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

非常感謝Marc。 – GromHellscream

+0

您在另一個線程(如果我記得正確)寫了繼承不是protobuf規範的一部分。那爲什麼序列化看起來像這樣(封裝在數據包前面)?任何消除這種情況的方法都是這樣的:[code] message C1 { optional int32 Z1 = 1;消息C2 { 可選int32 Z2 = 1; } [/ code] – GromHellscream

+0

@GromHellscream的確,繼承不是protobuf規範的一部分; protobuf-net使用封裝提供了一個方便的實現。序列化並不在數據包的「前面」 - 整個事件是一個單一的protobuf消息,可在任何平臺上使用。你提出的「那樣的東西」是沒有意義的:兩者都不包括其他。這裏的整個問題是,當談論繼承時,你需要能夠發送*任何* - 所以你可以發送**只是一個'C1'(而不是'C2'子類),或一個新的' C1'或'C2'的C3'子類。 protobuf網可以處理。如果你... –