2009-09-06 3 views
5

У меня есть файл XML смотрит несколько как это:Реализация IXmlSerializable на объекте коллекции

<xml> 
    <A>value</A> 
    <B>value</B> 
    <listitems> 
    <item> 
     <C>value</C> 
     <D>value</D> 
    </item> 
    </listitems> 
</xml> 

и у меня есть два объекта, представляющие этот XML:

class XmlObject 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
    List<Item> listitems { get; set; } 
} 

class Item : IXmlSerializable 
{ 
    public string C { get; set; } 
    public string D { get; set; } 

    //Implemented IXmlSerializeable read/write 
    public void ReadXml(System.Xml.XmlReader reader) 
    { 
    this.C = reader.ReadElementString(); 
    this.D = reader.ReadElementString(); 
    } 
    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
    writer.WriteElementString("C", this.C); 
    writer.WriteElementString("D", this.D); 
    } 
} 

я использую XmlSerializer для сериализации/десериализуйте XmlObject в файл.

Проблема заключается в том, что когда я реализовал пользовательские функции IXmlSerializable на моем элементе «под-объект», я всегда получаю только один элемент (первый) в моей коллекции XmlObject.listitems при десериализации файла. Если я удалю: IXmlSerializable, все работает так, как ожидалось.

Что делать неправильно?

Редактирование: У меня была реализована IXmlSerializable.GetSchema, и мне нужно использовать IXmlSerializable для моего «дочернего объекта» для выполнения определенного пользовательского преобразования значений.

ответ

2

Измените код следующим образом:

public void ReadXml(System.Xml.XmlReader reader) 
    { 
     reader.Read(); 
     this.C = reader.ReadElementString(); 
     this.D = reader.ReadElementString(); 
     reader.Read(); 
    } 

Сначала вы пропустите начало узла Item, прочитайте две строки, затем прочитайте за конечным узлом, чтобы читатель находился в правильном месте. Это будет читать все узлы в массиве.

Вы должны обратить внимание при изменении xml самостоятельно :)

+0

Большое вам спасибо. –

1

Вам не нужно использовать IXmlSerializable. Но если вы хотите, вы должны реализовать метод GetShema(). После некоторого изменения кода, который работает выглядит следующим образом:

[XmlRoot("XmlObject")] 
public class XmlObject 
{ 
    [XmlElement("A")] 
    public string A { get; set; } 
    [XmlElement("B")] 
    public string B { get; set; } 
    [XmlElement("listitems")] 
    public List<Item> listitems { get; set; } 
} 

public class Item : IXmlSerializable 
{ 
    [XmlElement("C")] 
    public string C { get; set; } 
    [XmlElement("D")] 
    public string D { get; set; } 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     throw new NotImplementedException(); 
    } 

    public void ReadXml(System.Xml.XmlReader reader) 
    { 
     this.C = reader.ReadElementString(); 
     this.D = reader.ReadElementString(); 
    } 

    public void WriteXml(System.Xml.XmlWriter writer) 
    { 
     writer.WriteElementString("C", this.C); 
     writer.WriteElementString("D", this.D); 
    } 

    #endregion 
} 

Результаты для 2-х элементов в ITEMLIST будет выглядеть:

<?xml version="1.0" encoding="utf-8"?> 
<XmlObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <A>value</A> 
    <B>value</B> 
    <listitems> 
    <C>value0</C> 
    <D>value0</D> 
    </listitems> 
    <listitems> 
    <C>value1</C> 
    <D>value1</D> 
    </listitems> 
</XmlObject> 
+0

Это ничего не меняет. Но спасибо за попытку. –

Смежные вопросы