【问题标题】:XmlSerializer produces different output for x86 and x64XmlSerializer 为 x86 和 x64 产生不同的输出
【发布时间】:2017-09-13 23:01:20
【问题描述】:

我有以下示例代码,它为 x86 和 x64 生成不同的输出。

class SampleSerializer
{
   public static string Serialize(string[] samples)
   {
      var xmlDocument = string.Empty;

      var xmlSerializer = new XmlSerializer(typeof(string[]));
      using (var ms = new MemoryStream())
      {
         xmlSerializer.Serialize(
            ms,
            samples);

         xmlDocument = Encoding.UTF8.GetString(ms.ToArray());
      }

      return xmlDocument;
   }
}

class Program
{
   static void Main(string[] args)
   {
      var samples = new string[] { };

      var doc = SampleSerializer.Serialize(samples);

      Console.WriteLine(doc);
   }
}

当平台目标是 x86 时,输出是:

<?xml version="1.0"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

当平台目标为 x64 时,输出为:

<?xml version="1.0"?>
<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />

您可以通过 Any CPU 和 Prefer 32-bit set 或 unset 实现相同的效果。

如果您仔细观察,xsixsd 命名空间的顺序是不同的。为什么会这样?我希望命名空间的顺序与平台无关。

【问题讨论】:

    标签: c# .net xml serialization namespaces


    【解决方案1】:

    XmlSerializer 在内部使用Hashtable 来保留命名空间(this one,然后是this one),因此您可以将示例简化为以下内容:

    var hash = new Hashtable();
    hash.Add("xsi", null);
    hash.Add("xsd", null);
    
    foreach (var name in hash.Keys)
    {
        Console.WriteLine(name);
    }
    

    x86:

    xsi
    xsd
    

    x64:

    xsd
    xsi
    

    转载!根据MSDN,从技术上讲,这是预期的:

    ICollection 中键的顺序未指定

    如果这还不够,我们可以在这里开始如履薄冰,猜猜为什么会这样。我最好的猜测是 Key 的顺序取决于 Key 的哈希码。

    好的,我们试试:

    Console.WriteLine("xsi: {0:x8}", "xsi".GetHashCode());
    Console.WriteLine("xsd: {0:x8}", "xsd".GetHashCode());
    

    x86:

    xsi: c5864a25
    xsd: c2b84cce
    

    x64:

    xsi: b9b66082
    xsd: b9b66087
    

    相同的字符串,不同平台的不同哈希码!

    但这也是MSDN 所期望的:

    不保证哈希码本身是稳定的。对于单个版本的 .NET Framework,相同字符串的哈希码在不同版本的 .NET Framework 和不同平台(例如 32 位和 64 位)之间可能会有所不同。在某些情况下,它们甚至可能因应用程序域而异。

    嗬嗬嗬,“它们甚至可能因应用程序域而异”!

    现在我不会依赖XmlSerializer 总是产生稳定的结果..

    【讨论】:

    • 有道理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2014-05-06
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多