2017-04-18 8 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は内部の名前空間(当時this onethis one)を維持するためにHashtableを使用していますので、あなたが次のようにあなたのサンプルを簡略化することができます。

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:

再現! ICollectionを内のキーの順序は

指定されていないことが十分でない場合、私たちはここに薄い氷の上を歩いて開始することができ、それがある理由を推測

MSDNごとに技術的にそれは、期待されますだから。私の推測では、Keysの順序はKeysのハッシュコードに依存しています。

[OK]を、試してみましょう:

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は、常に安定した結果を生み出す上で、私は依存しないだろう...理にかなって

+0

。 –