2009-05-22 63 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

丹尼尔,你有更多的问题吗?我想你已经得到了答案。 – 2009-07-26 15:40:05

+0

ReadSubtree方法是解决问题的关键。我没有将当前答案标记为已接受,因为它没有解释如何做到这一点。 – 2009-07-29 17:57:42

回答

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 
} 

读者也有类似的方法。 编辑:要只读取列表,并且在列表完成后但在流结束之前停止阅读,则需要使用ReadSubTree(信贷Marc Gravell)。