2

明らかに、具体的な型がコンパイラに認識されていない場合、インターフェイスをシリアル化/逆シリアル化することは不可能です。

インターフェイスのみMyInterfacesのアセンブリと、これらのインターフェイスの内部実装を含むアセンブリMyImplがあります。インスタンス化は次のようになります。

MyInterfaces.IFoo foo = MyImpl.FooFactory.CreateFoo();

組み立て中の工場は次のMyImplとおりです。

IFoo CreateFoo()
{
    return new Foo(); // Internal class!
}

そして、これFooが assembly の具象クラスですMyImpl:

[DataContract]
internal class Foo : IFoo
{
    [DataMember]
    public string Bar
    {
        get;
        set;
    }
}

シリアル化は簡単です

工場で作成されたIFooオブジェクトのタイプを読み取ると、IFooインターフェイスのシリアル化が可能になります。

var serializer = new DataContractSerializer(typeof(MyFooContainer),
    new Type[] { container.Foo.GetType() });
serializer.WriteObject(writer, container);

デシリアライズ不可?

逆シリアル化するとき、見るオブジェクトがないため、型を推測できません!

var serializer = new DataContractSerializer(typeof(MyFooContainer),
    new Type[] { /* CANNOT provide other assembly's internal type! */ });
container = (MyFooContainer)serializer.ReadObject(reader);

オブジェクトのDataContractSerializer作成方法を決定するには、シリアル化された XML で十分だと思っていましたが、そうではありませんでした。MyImpl.Fooそれは私にこれを教えてくれます:

「行 1 位置 269 のエラー。要素 ' http://schemas.datacontract.org/2004/07/MyAssembly:Foo ' には、名前 ' http://schemas.datacontract.org/2004にマップされるタイプのデータが含まれています。 /07/MyImpl:Foo '。デシリアライザーには知識がありません...」

Q: を使用してDataContractSerializer、別のアセンブリの内部の派生クラスへのインターフェイスをどのように逆シリアル化しますか?

明らかに、内部実装とのパブリック インターフェイスを持つことは理にかなっています。シリアル化を許可することも理にかなっています。助けてください!

この特定の問題の詳細: http://blogs.msdn.com/b/sowmy/archive/2008/10/04/serializing-internal-types-using-xmlserializer.aspx

4

2 に答える 2

3

インターフェイスのインスタンスを配信するファクトリに、オブジェクトをシリアル化/逆シリアル化するシリアライザーを配信する別の方法を持たせることができます。そうすれば、シリアライザーはすべての内部クラスを知ることができます。

于 2013-05-29T09:41:37.440 に答える