2011-06-10 8 views
6

私はCF.NET & .NETで動作するライブラリを持っていますが、シリアル化は両方で異なります。結果として、CF.NETの下で生成されたXMLファイルは.NETの下では読み込めません。それは私の大きな問題です!ここでXmlSerializerは.NET 3.5とCF.NET 3.5の間で異なります

コードサンプル:

[Serializable, XmlRoot("config")] 
public sealed class RemoteHost : IEquatable<RemoteHost> 
{ 
    // ... 
} 

public class Program 
{ 
    public static void Main() 
    { 
     RemoteHost host = new RemoteHost("A"); 
     List<RemoteHost> hosts = new List<RemoteHost>(); 
     hosts.Add(host); 
     XmlSerializer ser = new XmlSerializer(typeof(List<RemoteHost>)); 
     ser.Serialize(Console.Out, hosts); 
    } 
} 

CF.NETのXML:私は同じことを生成するために、私のプログラムを変更するにはどうすればよい

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

の.NET XML

<?xml version="1.0" encoding="ibm850"?> 
<ArrayOfRemoteHost xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <RemoteHost Name="A"> 
    </RemoteHost> 
</ArrayOfRemoteHost> 

XML?

答えて

4

実際にはルート名を処理するバグのようです。回避策として:手動ルートの制御を取る:

[XmlRoot("foo")] 
public class MyRoot { 
    [XmlElement("bar")] 
    public List<RemoteHost> Hosts {get;set;} 
} 

これは、どちらのプラットフォーム上

<foo><bar>...</bar>...</foo> 

としてシリアル化する必要があります。あなたの好みの名前の代わりにfoobarを置き換えてください。

(個人的に、私はしかし、バイナリ出力を使用することだろう; P)

+0

Arghhhhhh ...私はすべての私のビジネスモデル...バイナリ出力を再構築する必要があるこの方法をやって? –

+0

@Arnaud - 直列化の時点でラッパーを追加するだけでは、モデル全体が実際に変更されるわけではありません。 –

+0

シリアル化したい場合は、RemoteHostをMyRootに追加する必要があります。 –