【发布时间】:2013-05-24 12:09:36
【问题描述】:
显然,如果编译器不知道具体类型,则无法序列化/反序列化接口。
我有一个纯接口程序集MyInterfaces 和一个程序集MyImpl,其中有这些接口的内部 实现。实例化如下所示:
MyInterfaces.IFoo foo = MyImpl.FooFactory.CreateFoo();
这是组装中的工厂MyImpl:
IFoo CreateFoo()
{
return new Foo(); // Internal class!
}
这是程序集MyImpl 中的具体Foo 类:
[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
【问题讨论】:
标签: c# serialization datacontractserializer