XmlSerializer在MSTest runner和NCrunch中表现不同

时间:2013-06-20 06:40:02

标签: xml xml-serialization mstest xmlserializer ncrunch

我的一位同事在通过MSTest Runner或NCrunch运行时遇到XMLSerializer行为不同的情况。

当通过N-Crunch运行测试时,输出包含

xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

通过MSTest Runner运行时,输出包含

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xsixsd的顺序不同。输出的其余部分是相同的。

这可能是什么原因?

我们不会在配置中使用任何<system.xml.serialization>设置。

2 个答案:

答案 0 :(得分:4)

我无法回答你原来的问题,我发现因为我们与MsTest和NUnit存在完全相同的问题,但我可以为发现自己处于这种情况的其他人推荐一个有效的解决方法。这是使用XML Canonicalization,例如:

using System.Security.Cryptography.Xml;

string canonicaliseXml(string xmlInput)
{
    XmlDocument myDoc = new XmlDocument();
    myDoc.LoadXml(xmlInput);
    XmlDsigC14NTransform t = new XmlDsigC14NTransform();
    t.LoadInput (myDoc);
    var ms = (MemoryStream)t.GetOutput();
    return Encoding.UTF8.GetString(ms.ToArray());
}

XML Canonicalization通过以下步骤规范化XML字符串:删除元素之间的空白,按字母顺序排序属性以及扩展短格式空元素(http://en.wikipedia.org/wiki/Canonical_XML处有一个有用的解释),以便:

<root x='x'  a='a'>  <trunk>etc</trunk> <empty />  </root> 

将被规范化为

<root a="a" x="x"><trunk>etc</trunk><empty></empty></root> 

显然,这将解决xsd和xsi名称空间声明顺序的任何差异,正如我们和原始海报所经历的那样。

EDIT 如果你想采用带括号方法,你可以将它与http://silent-code.blogspot.co.uk/2009/09/using-xmlserializer-without-rendering.html中的“new XmlSerializerNamespaces()”技术结合起来,该技术从初始序列化中过滤掉冗余的xsd和xsi名称空间声明。

答案 1 :(得分:3)

假设NCrunch和NUnit以相同的方式工作,之所以存在差异,是因为MS Test运行32位版本的XmlSerializer而NCrunch运行64位版本。为了使NCrunch的工作方式与MS Test相同,您可以将x86指定为NCrunch测试项目的平台目标。

从技术上讲,两个版本的XML完全相同,顺序无关紧要,因此在测试XML是否正确时,Francis的解决方法是有意义的。