【问题标题】:How to use default XML serialization from within custom XML serialization methods如何在自定义 XML 序列化方法中使用默认 XML 序列化
【发布时间】:2009-05-22 14:37:14
【问题描述】:

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

    }
}

【问题讨论】:

  • 丹尼尔,您对此还有其他问题吗?我想你已经得到了答案。
  • ReadSubtree 方法是解决问题的关键。我没有将当前答案标记为已接受,因为它没有确切说明如何执行此操作。

标签: c# .net xml-serialization


【解决方案1】:

对于编写器,您可以为 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)。

【讨论】:

猜你喜欢
  • 2012-06-08
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 2021-10-27
  • 2012-01-31
相关资源
最近更新 更多