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