gpt4 book ai didi

c# - 如何将接口(interface)反序列化为另一个程序集的内部类?

转载 作者:行者123 更新时间:2023-12-03 19:08:46 25 4
gpt4 key购买 nike

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

我有一个只有接口(interface)的程序集 MyInterfaces 和一个程序集 MyImpl 以及这些接口(interface)的内部 实现。实例化看起来像这样:

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 接口(interface):

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,如何将接口(interface)反序列化为另一个程序集的内部派生类?

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

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

最佳答案

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

关于c# - 如何将接口(interface)反序列化为另一个程序集的内部类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16810386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com