1

我正在使用设计不佳的 API。我有一个需要序列化的类,并且我可以控制该类的构成,但不能控制构成该类正在序列化的属性的类型。下面是一个例子:

<Project>
  <SomeProperty1 />
  <Install>
    <DefaultStep></DefaultStep>
  </Install>
  <Uninstall>
    <DefaultStep></DefaultStep>
  </Uninstall>
</Project>

问题是,我无法控制“安装”和“卸载”类型,它们的嵌套类型具有相同的名称。“安装”驻留在 MyCompany.Install.dll 中,“卸载”驻留在 MyCompany.Uninstall.dll 中。但更重要的是,MyCompany.Uninstall.dll 引用了 MyCompany.Install.dll,这完全没有意义。我知道这是一个糟糕的设计(我正在处理的整个框架都很糟糕),但我没有选择使用它。

我得到的错误是:

“类型 'MyCompany.Install.Uninstall.DefaultStep' 和 'MyCompany.Install.DefaultStep' 都使用来自命名空间 '' 的 XML 类型名称 'DefaultStep'。使用 XML 属性为类型。”

这将是一个好主意,除了我对包含“安装”和“卸载”类的程序集的控制为零。

有任何想法吗?

4

2 回答 2

2

如果您有权访问 .NET 3.5,我将使用 DataContract 序列化程序,并实现 IDataContractSurrogate。代理序列化允许您在序列化时用替代类型替换正在搞砸序列化的繁琐类型。您可以完全控制代理人。那应该可以帮助您解决问题。

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.idatacontractsurrogate.aspx

于 2009-09-26T18:56:01.847 回答
0

我找到了一个有效的答案。本文评论:http: //www.codeproject.com/KB/XML/xmlserializerforunknown.aspx

引导我阅读这篇文章: http: //mfharoon.blogspot.com/2006/12/using-ixmlserializable-to-overcome-not.html

您唯一需要更改的是第 108 行,它需要阅读:

writer.WriteAttributeString("type", _parameters.GetType().AssemblyQualifiedName.ToString());

如果类型在单独的程序集中,这将使序列化工作。

于 2009-09-26T21:07:05.577 回答