如何将接口反序列化为另一个程序集的内部类?

时间:2013-05-29 09:36:47

标签: c# serialization datacontractserializer

显然,如果具体类型未知,则无法对接口进行序列化/反序列化。

我有一个仅接口的程序集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“的类型的数据。反序列化器不知道......”< / em>的

问:使用DataContractSerializer,如何将接口反序列化为另一个程序集的内部派生类?

显然,拥有内部实现的公共接口是有意义的。允许序列化也是有意义的。请帮忙!

有关此特定问题的更多信息:http://blogs.msdn.com/b/sowmy/archive/2008/10/04/serializing-internal-types-using-xmlserializer.aspx

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

我认为你通过欺骗DataContractSerializer来排除非公开数据,从而打败了它。 DataContractSerializer的设计使其仅用于序列化公开可见可共享数据。这有助于通过以WSDL等格式共享类型信息来实现平台和技术的独立性。

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