【问题标题】:Nested Classes w/ Same Name in Separate Assemblies Causing Serialization Headaches在不同的程序集中具有/相同名称的嵌套类导致序列化头痛
【发布时间】:2009-09-26 18:40:47
【问题描述】:

我正在使用设计不佳的 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 的 XML 属性 类型的名称和/或命名空间。”

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

有什么想法吗?

【问题讨论】:

    标签: c# xml-serialization nested-class


    【解决方案1】:

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

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

    【讨论】:

    • Slick,我以前从未见过。
    • @Greg:当我发现它时我也很惊讶。微软工程师无尽的远见从未停止让我惊叹。占每个场景。 ;)
    • 感谢你们的帮助。我发布了我在下面找到的解决方案。
    【解决方案2】:

    我找到了一个有效的答案。本文评论: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());

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

    HTH!

    【讨论】:

      猜你喜欢
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多