2011-06-10 14 views
6

Mam bibliotekę, która zmienia się w CF.NET & .NET, ale serializacja różni się między nimi. W rezultacie plik XML wygenerowany w CF.NET nie jest czytelny w środowisku .NET i jest to dla mnie duży problem!XmlSerializer różni się .NET 3.5 i CF.NET 3.5

Oto próbka kodu:

[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> 

Jak mogę zmodyfikować swój program w celu wytworzenia tej samej XML?

Odpowiedz

4

Wygląda na to, że błąd przetwarza nazwę root. Jako obejście: przejąć kontrolę nad korzenia ręcznie:

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

ten powinien serializacji jako

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

na każdej platformie. Zamień foo i bar dla swoich preferowanych nazw.

(osobiście byłbym za pomocą wyjścia binarnego, mimo; p)

+0

Arghhhhhh ... Robi w ten sposób Potrzebuję zrestrukturyzować cały mój model biznesowy ... wyjście binarne? –

+0

@Arnaud - samo dodanie wrappera w momencie serializacji tak naprawdę nie zmienia całego modelu. –

+0

Muszę dodać wszystkie RemoteHost do MyRoot, jeśli chcę je serializować, zobaczę ... –

Powiązane problemy