【问题标题】:XmlSerializer produces slightly different XML on different machinesXmlSerializer 在不同的机器上产生稍微不同的 XML
【发布时间】:2018-02-16 13:50:15
【问题描述】:

我有一个最近需要维护的旧 C# .net4 项目,其中一个将序列化对象与“主食”XML 字符串进行比较的单元测试由于命名空间的细微差别而开始失败,即比较字符串上的命名空间是xmlns:xsd 并且在序列化对象上是 xmlns:xsi。 奇怪的是,相同的单元测试在不同的机器上运行良好。

我不知道为什么会发生这种情况。

【问题讨论】:

标签: c# .net-4.0 xmlserializer


【解决方案1】:

更改测试。您不应该将 xmls 作为字符串进行比较。

<a i="1" b="2"/>

相同
<a b="2" i="1"/>

如果将其作为字符串进行比较,它们会有所不同,但作为 xml,它们是相同的。

这个post 应该可以帮助你。

【讨论】:

  • 我已经做到了,但我的问题仍然是为什么首先会出现这种差异。
  • 所有机器上都使用相同的 .NET、Windows 和 32/64 位吗?可能类似于this post
  • 这就是正在发生的事情,谢谢!但这意味着没有神奇的解决方案:(哦,好吧
  • @IgorK。 - 如果只是属性顺序不同,您可以解析为XElement 并使用XNode.DeepEquals(XNode, XNode)。我一直在测试中这样做。
【解决方案2】:

不知道是不是你的情况,但是,当我不得不使一些 WCF 与 ASMX 旧 Web 服务兼容时,事实证明 XmlSerializer 的工作方式根据 .NET 框架上的版本不同,在尝试反序列化时会导致异常对象或重新读取 xml。

在旧机器上运行旧版本的框架的旧应用程序在新机器上的行为可能会有所不同,这是有道理的,因为即使项目以旧框架为目标,新的框架也会用于详细说明某些部分,例如 XML。

添加更多细节,我认为区别在于从 2.0 .NET 框架到较新框架(3、3.5 等)的过渡。但我不确定这一点,因为已经过去了很长一段时间。

我再说一遍,我不知道这是否是你的情况,但这可能是一个原因。一个测试应该是在旧机器上将框架升级到与新机器相同的版本,并检查是否产生相同的输出,然后在安装新框架之前将系统回滚到之前的状态。

检查这个: this,绝对是THIS,还有this

让我知道这是否有用。

【讨论】:

  • 我的想法完全正确。但是,由于我是 .NET 世界的一个相对较新的人,我天真地认为框架 4 无论如何都是相同的,并且应该以相同的方式运行......
  • @IgorK。嗯,你应该试试。我正在添加更多详细信息,请在几分钟后检查问题
  • @IgorK。检查文章,让我知道它是否有任何帮助
猜你喜欢
  • 1970-01-01
  • 2018-03-27
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 2017-09-13
  • 2012-04-30
  • 2023-01-25
相关资源
最近更新 更多