2009-05-22 2 views
5

У меня есть класс в .NET, который реализует IXmlSerializable. Я хочу сериализовать его свойства, но они могут быть сложными типами. Эти сложные типы будут совместимы с сериализацией XML, но они не реализуют сами IXmlSerializable. Из моих методов ReadXml и WriteXml, как мне вызвать логику чтения/записи по умолчанию на XmlReader/XmlWriter, который передается мне.Как использовать стандартную сериализацию XML из встроенных методов XML-сериализации

Возможно, код будет сделать его более ясным, что я хочу:

public class MySpecialClass : IXmlSerializable 
{ 
    public List<MyXmlSerializableType> MyList { get; set; } 

    System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema() 
    { 
     return null; 
    } 

    void IXmlSerializable.ReadXml(System.Xml.XmlReader reader) 
    { 
     // Read MyList from reader, but how? 
     // Something like this? 
     // MyList = (List<MyXmlSerializableType>) 
      reader.ReadObject(typeof(List<MyXmlSerializableType>)); 
    } 

    void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) 
    { 
     // Write MyList to writer, but how? 
     // Something like this? 
     // writer.WriteObject(MyList) 

    } 
} 
+0

Даниэль, у вас есть еще вопросы по этому вопросу? Думаю, тебе дали ответ. –

+0

Метод ReadSubtree был ключом к решению проблемы. Я не ответил на текущий ответ, потому что он не объясняет, как это сделать. –

ответ

9

Для писателя, вы можете просто создать XmlSerializer для MySerializableType, затем сериализаций списка через него рекордер.

void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer) 
{ 
    // write xml decl and root elts here 
    var s = new XmlSerializer(typeof(MySerializableType)); 
    s.Serialize(writer, MyList); 
    // continue writing other elts to writer here 
} 

Существует аналогичный подход для читателя. EDIT: Чтобы прочитать только список и прекратить чтение после завершения списка, но до конца потока вам необходимо использовать ReadSubTree (кредит Marc Gravell).

+2

Последнее значение: ReadSubtree: http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readsubtree.aspx –

+0

ReadSubTree, классно! Я узнал что-то новое! – Cheeso

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