如何在自定义XML序列化方法中使用默认的XML序列化?

10
我在.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)

    }
}

丹尼尔,你对此还有更多问题吗?我认为你已经得到了答案。 - John Saunders
ReadSubtree方法是解决问题的关键。我还没有将当前答案标记为已接受,因为它没有准确地解释如何做到这一点。 - Daniel Plaisted
1个回答

13

对于写入者,你可以为MySerializableType创建一个XmlSerializer,然后通过它将列表序列化到你的写入器中。

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(归功于Marc Gravell)。


4
关于最后一点:ReadSubtree方法:http://msdn.microsoft.com/zh-cn/library/system.xml.xmlreader.readsubtree.aspx - Marc Gravell
1
XmlSerializer 实例是否足够轻量级,可以在每次调用时实例化,还是应该进行缓存? - julealgon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接