Как использовать сериализацию XML по умолчанию из пользовательских методов сериализации XML - PullRequest
5 голосов
/ 22 мая 2009

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

Возможно, код прояснит то, что я хочу:

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)

    }
}

1 Ответ

10 голосов
/ 22 мая 2009

Для писателя вы можете просто создать 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
}

Существует аналогичный подход для читателя. РЕДАКТИРОВАТЬ : Чтобы прочитать только список и прекратить чтение после того, как список завершен, но до конца потока, вам нужно использовать ReadSubTree (кредит Марк Грэвелл).

...