protobuf-net.2.1.0
いるProtobufネット:シンプル継承:デシリアライズ、タイプとしてシリアライズサブタイプは、InvalidCastExceptionが
を投げるよう私の理解では、protobuf-net
が完全に受信機側で利用可能な情報に基づいてデシリアライズのメッセージコントラクトを決めるということです - シリアライズされたパケット自体はメッセージ契約を構築するために依存しません。具体的には、クラスメンバ属性は、データ型と、パケット内に見つかると予想されるフィールドの順序付けを示します。
したがって、送信側は受信側とは独立しているため、フィールドデータ&の順序が受信側プロトタイプ契約で定義された順序と一致する場合は、シリアル化されたパケットを特定のタイプとして解釈できる必要があります。
特に、継承に関しては、継承が正しく表記されている場合は、基本型のオブジェクトを直列化してサブタイプのオブジェクトとして直列化することが可能でなければなりません。
しかし、単純な継承階層DerivedClass : BaseClass
のために、私は私がBaseClass
としてシリアライズしDerivedClass
としてデシリアライズ場合、返されるオブジェクトの型BaseClass
のものであろうことがわかります。ここで
はクラスです:
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.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; }
}
は、以下の試験方法の実行
タイプの例外を 'System.InvalidCastExceptionの' で発生しました protobuf-net.dllが、ユーザコード
で処理されませんでした追加情報:タイプ 'protobuf_net.lib.ProtoClasses.SimpleBaseClass'のオブジェクトをキャストして 'protobuf_net.lib.ProtoClasses.SimpleDerivedClass'と入力できません。
@dbcおかげで(私の投稿を編集してコードが説明と一致するようにしました – BaltoStar