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

本文关键字:另一个 程序集 内部类 反序列化 接口 | 更新日期: 2023-09-27 18:15:45

显然,如果具体类型不为编译器所知,则无法对接口进行序列化/反序列化。

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

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

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

我认为您欺骗DataContractSerializer序列化非公共数据,从而违背了它的目的。DataContractSerializer的设计就是为了只序列化公开可见的可共享的数据。通过使以WSDL等格式共享类型信息成为可能,这有助于实现平台和技术独立性。

对于您希望实现的功能-最好使用BinaryFormatter。然而,你只能使用。net进行反序列化。