2008-09-24 4 views
22

Я нашел проблему с XML-сериализацией C#. Выходной сигнал сериализатора несовместим между обычными Win32 и WinCE (но удивительно, что WinCE имеет выходной сигнал IMO). Win32 просто игнорирует атрибут Class2 XmlRoot("c2").C# Array XML Serialization

Кто-нибудь знает, как получить WinCE как вывод на Win32 (потому что я не хочу, чтобы теги XML имели имя класса класса сериализации).

Код проверки:

using System; 
using System.Xml.Serialization; 
using System.IO; 

namespace ConsoleTest 
{ 
    [Serializable] 
    [XmlRoot("c1")] 
    public class Class1 
    { 
     [XmlArray("items")] 
     public Class2[] Items; 
    } 

    [Serializable] 
    [XmlRoot("c2")] 
    public class Class2 
    { 
     [XmlAttribute("name")] 
     public string Name; 
    } 

    class SerTest 
    { 
     public void Execute() 
     { 
      XmlSerializer ser = new XmlSerializer(typeof (Class1)); 

      Class1 test = new Class1 {Items = new [] {new Class2 {Name = "Some Name"}, new Class2 {Name = "Another Name"}}}; 

      using (TextWriter writer = new StreamWriter("test.xml")) 
      { 
       ser.Serialize(writer, test); 
      } 
     } 
    } 
} 

Ожидаемый XML (WinCE генерирует это):

<?xml version="1.0" encoding="utf-8"?> 
<c1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <items> 
    <c2 name="Some Name" /> 
    <c2 name="Another Name" /> 
    </items> 
</c1> 

Win32 XML (кажется, неправильная версия):

<?xml version="1.0" encoding="utf-8"?> 
<c1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <items> 
    <Class2 name="Some Name" /> 
    <Class2 name="Another Name" /> 
    </items> 
</c1> 

ответ

35

Try [XmlArrayItem («c2»)]

[XmlRoot("c1")] 
public class Class1 
{ 
    [XmlArray("items")] 
    [XmlArrayItem("c2")] 
    public Class2[] Items; 
} 

или [XmlType ("с2")]

[XmlType("c2")] 
public class Class2 
{ 
    [XmlAttribute("name")] 
    public string Name; 
}