XmlSerializer отличается между .NET 3.5 и CF.NET 3.5 - PullRequest
6 голосов
/ 10 июня 2011

У меня есть библиотека, которая включается в CF.NET и .NET, но сериализация отличается между ними. В результате XML-файл, созданный в CF.NET, не читается в .NET, и для меня это большая проблема!

Вот пример кода:

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

1 Ответ

4 голосов
/ 10 июня 2011

Похоже, ошибка при обработке корневого имени. В качестве обходного пути: возьмите рут под контроль вручную:

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

Это должно сериализоваться как

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

на любой платформе. Замените foo и bar на ваши предпочтительные имена.

(лично я бы использовал двоичный вывод, хотя; p)

...