2

显然,如果编译器不知道具体类型,就不可能序列化/反序列化接口。

我有一个纯接口程序集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

4

2 回答 2

3

您可以让提供接口实例的工厂有另一种方法来提供序列化程序来序列化/反序列化对象。这样,序列化程序就可以知道所有的内部类。

于 2013-05-29T09:41:37.440 回答
3

我认为您通过欺骗 DataContractSerializer 序列化非公共数据来破坏它的目的。DataContractSerializer 的设计旨在仅序列化公开可见可共享的数据。这有助于以 WSDL 等格式共享类型信息,从而实现平台和技术独立性。

对于您希望实现的功能 - 最好使用 BinaryFormatter。但是,您只能使用 .NET 进行反序列化。

于 2013-05-29T10:11:54.290 回答