protobuf-net.2.1.0
protobuf網:簡單的繼承:序列類型,序列化作爲分型引發InvalidCastException
我的理解是,protobuf-net
確定反序列化完全基於信息基礎上的接收方提供的消息,合同 - 序列化的數據包本身並不依賴於構建消息協議。具體而言,類成員屬性指示數據類型和預期在數據包中找到的字段的順序。因此,由於發送方獨立於接收方,如果字段數據&命令匹配由接收方協議定義,它應該有可能將任何序列化數據包解釋爲特定類型。
具體而言,關於繼承,應該可以序列化一個base-type對象和de-serialize作爲子類型的對象 - 前提是繼承是正確標記的。
然而,對於一個簡單的繼承層次DerivedClass : BaseClass
,我發現,如果我作爲序列化和BaseClass
反序列化爲DerivedClass
,返回的對象將是BaseClass
類型。
下面是類:
[ProtoBuf.ProtoInclude(1000, typeof(DerivedClass))]
[ProtoBuf.ProtoContract]
public class BaseClass
{
[ProtoBuf.ProtoMember(1, IsRequired = false, Name = @"Name", DataFormat = ProtoBuf.DataFormat.TwosComplement)]
public string Name { get; set; }
}
[ProtoBuf.ProtoContract]
public class DerivedClass : BaseClass
{
[ProtoBuf.ProtoMember(2, IsRequired = false, Name = @"Index", DataFormat = ProtoBuf.DataFormat.TwosComplement)]
public int Index { get; set; }
}
執行以下測試方法:
public class TestClass
{
public static void Test()
{
var baseObject = new BaseClass { Name = "BaseObject" };
var derivedObject = new DerivedClass { Name = "DerivedObject", Index = 1 };
using (var stream = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(stream, baseObject);
Debug.WriteLine(stream.Length);
stream.Seek(0, SeekOrigin.Begin);
// either of next two lines will throw the invalid cast exception :
// DerivedClass derivedObjectOut = ProtoBuf.Serializer.Deserialize<DerivedClass>(stream);
// var objectOut = ProtoBuf.Serializer.Deserialize<DerivedClass>(stream);
// no exception thrown but internal type of objectOut is unexpectedly BaseClass :
var objectOut = ProtoBuf.Serializer.Deserialize<DerivedClass>(stream);
}
}
}
產生[例外:
類型的例外,則 '' 發生在 protobuf-net.dll但未在用戶代碼中處理
其他信息:無法投射 'protobuf_net.lib.ProtoClasses.SimpleBaseClass'類型的對象以鍵入 'protobuf_net.lib.ProtoClasses.SimpleDerivedClass'。
捕捉那些錯別字@dbc感謝(從錯誤的來源複製/粘貼) - 我修改了我的帖子,以便代碼與描述 – BaltoStar