显然,如果编译器不知道具体类型,就不可能序列化/反序列化接口。
我有一个纯接口程序集MyInterfaces
和一个MyImpl
具有这些接口的内部实现的程序集。实例化如下所示:
MyInterfaces.IFoo foo = MyImpl.FooFactory.CreateFoo();
这是组装工厂MyImpl
:
IFoo CreateFoo()
{
return new Foo(); // Internal class!
}
这是Foo
汇编中的具体类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);
我希望序列化的 XML 足以DataContractSerializer
确定如何创建MyImpl.Foo
对象,但没有。它告诉我这个:
“第 1 行位置 269 错误。元素' http://schemas.datacontract.org/2004/07/MyAssembly:Foo '包含映射到名称的类型的数据' http://schemas.datacontract.org/2004 /07/MyImpl:Foo '。反序列化器没有知识……”
问:使用DataContractSerializer
,如何将接口反序列化为另一个程序集的内部派生类?
显然,拥有带有内部实现的公共接口是有意义的。允许序列化也是有意义的。请帮忙!
有关此特定问题的更多信息:http: //blogs.msdn.com/b/sowmy/archive/2008/10/04/serializing-internal-types-using-xmlserializer.aspx