2011-06-10 13 views
6

Ho una libreria che gira sotto CF.NET &. NET ma la serializzazione differisce tra entrambi. Di conseguenza, un file XML generato sotto CF.NET non è leggibile sotto .NET, e questo è un grosso problema per me!XmlSerializer è diverso tra .NET 3.5 e CF.NET 3.5

Ecco il codice di esempio:

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

Come posso modificare il mio programma al fine di generare la stessa XML?

risposta

4

Sembra un bug che elabora il nome radice, in effetti. Come soluzione: prendere il controllo della radice manualmente:

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

Questo dovrebbe serializzare come

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

su entrambe le piattaforme. Sostituire foo e bar per i nomi preferiti.

(personalmente, sarei usando uscita binaria, però; p)

+0

Arghhhhhh ... Facendo in questo modo ho bisogno di ristrutturare tutto il mio modello di business ... Uscita binaria? –

+0

@Arnaud - l'aggiunta di un wrapper nel punto di serializzazione non modifica realmente l'intero modello. –

+0

Devo aggiungere tutto RemoteHost a MyRoot se voglio serializzarli, vedremo ... –