2017-04-18 41 views
1

我有以下示例代码,它为x86和x64生成不同的输出。XmlSerializer为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" /> 

可以达到同样与任何CPU和优先选择32位设置或取消设置。

如果仔细看看,命名空间xsixsd的顺序是不同的。为什么这样?我期望命名空间的顺序是独立于平台的。

回答

3

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); 
} 

86:

xsi 
xsd 

64:

转载!从技术上说的预期,按照MSDN

在ICollection的按键的顺序是不确定的

如果这还不够,我们可以从这里开始如履薄冰和猜测为什么它是所以。我最好的猜测是Keys的顺序取决于Keys的哈希码。

好吧,让我们尝试:

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

86:

xsi: c5864a25 
xsd: c2b84cce 

64:

xsi: b9b66082 
xsd: b9b66087 

相同字符串,不同的散列针对不同平台的代码!

但同样提供预期每MSDN

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

何浩豪,“他们甚至可以根据应用领域不同”!

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

+0

这是有道理的。 –