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);
}
非常感謝Marc。 – GromHellscream
您在另一個線程(如果我記得正確)寫了繼承不是protobuf規範的一部分。那爲什麼序列化看起來像這樣(封裝在數據包前面)?任何消除這種情況的方法都是這樣的:[code] message C1 { optional int32 Z1 = 1;消息C2 { 可選int32 Z2 = 1; } [/ code] – GromHellscream
@GromHellscream的確,繼承不是protobuf規範的一部分; protobuf-net使用封裝提供了一個方便的實現。序列化並不在數據包的「前面」 - 整個事件是一個單一的protobuf消息,可在任何平臺上使用。你提出的「那樣的東西」是沒有意義的:兩者都不包括其他。這裏的整個問題是,當談論繼承時,你需要能夠發送*任何* - 所以你可以發送**只是一個'C1'(而不是'C2'子類),或一個新的' C1'或'C2'的C3'子類。 protobuf網可以處理。如果你... –