5

アセンブリ A:

[DataContract]    
        public class Base
        {
            [DataMember]
            public string SomeText { get; set; }
        }

アセンブリ B:

internal class Helper
        {
           internal static Base Deserialize(string serializedInstanceOfTypeBase)
    {
                   DataContractSerializer serializer = new DataContractSerializer(typeof (Base));
                    XmlReader reader = XmlReader.Create(new StringReader(serializedInstanceOfTypeBase));
                    return (Base)serializer.ReadObject(reader);
    }
    }

アセンブリ C:

[DataContract]    
        public class Derived : Base
        {
            [DataMember]
            public string SomeMoreText { get; set; }
        }

タイプのインスタンスをシリアル化Derivedしてメソッドに渡すと、次Helper.Deserialize()のエラーで失敗しますSerializationException

行 1 の位置 2 にエラーがあります。名前空間 'http://schemas.datacontract.org/2004/07' から要素 'Base' が必要です.. 名前が 'Derived'、名前空間 'http://schemas.datacontract' の 'Element' が見つかりました.org/2004/07'.

どうすればこの問題を解決できますか?

属性は認識していKnownTypeますが、アセンブリ A と B でコーディングする時点では、その派生型はまったく認識していません。だから私はその解決策を使うことができません。

私の製品のデザインはより複雑で、ここに完全に掲載することはできません. Helper.Desrialize()メソッドはstring引数を取得するだけです。Base実行時であっても、アセンブリ A または B がクラスの派生型について知る方法は (少なくとも現時点では) ありません。

アセンブリ B はアセンブリ A を参照しますが、A & B はアセンブリ C を参照できません。

C#4.0を使用しています。提供するソリューションが を使用していなくても問題ありませんDataContractSerializer

4

2 に答える 2

4

両方が必要なようです:

  • KnownTypes のコレクションをデシリアライザーに渡します (上記のとおり)。
  • タイプをチェックしないようにデシリアライザーに指示します (verifyObjectNameパラメーターを使用)。

    return (Base)serializer.ReadObject(reader, false);
    

詳細はこちら: http://msdn.microsoft.com/en-us/library/ms573850%28v=vs.110%29.aspx

于 2014-01-08T20:55:37.770 に答える