【问题标题】:How do you deserialize an interface to an internal class of another assembly?如何将接口反序列化到另一个程序集的内部类?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我们会接受这个解决方案。
    【解决方案2】:

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

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

    【讨论】:

    • 这并不完全正确。由于 DataContractSerializer 可以序列化几乎所有内容,私有或只读成员也是如此。在某些情况下,反序列化端是由一组完全不同的技术实现的。序列化没有限制,也没有作弊之类的事情,因为 WSDL 使所有内容都可见和公开。如何在内部处理序列化或反序列化数据取决于网络每一端的实现——它们将哪些部分发布给消费者。
    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多