如何在我的类中使用IXmlSerializable序列化可序列化数据?

时间:2011-08-18 21:05:32

标签: c# .net serialization

我有一个类IXmlSerializable类,如下所示:

public class SomeClass : IXmlSerializable
{
    public SomeSerializableClass ClassA { get; set; }

    public SomeNonSerializableClass ClassB { get; set; }

    public void ReadXml(XmlReader reader)
    {
        reader.ReadStartElement("RootElement");

        do
        {
            if (reader.Name == "SomeNonSerializableClass")
            {
                // Perform custom serialization
            }
            else if (reader.Name == "SomeSerializableClass")
            {
                // I just want to use the SomeSerializableClass's
                // already implemented serialization process here.
            }
        }
        while (reader.Name != "RootElement");

        reader.ReadEndElement();
    }
}

让我们看一下这个例子的ReadXml实现。我有两个类,一个是名称SomeNonSerializableClass,这就是SomeClass类已实现IXmlSerializable的原因。然后,我也使用SomeSerializableClass,可以使用XmlSerializer进行原生序列化。

我正在使用SomeClass序列化XmlSerializer,我可以手动序列化SomeSerializableClass,但为什么我可以使用.NETs序列化类序列化它?那么我怎样才能将它序列化并传递给读者/作者?

1 个答案:

答案 0 :(得分:2)

您可以将XmlSerializer用于该类型。类似的东西:

public void ReadXml(XmlReader reader)
{
    reader.ReadStartElement("SomeClass");

    do
    {
        if (reader.Name == "ClassB")
        {
            reader.ReadStartElement();

            // manually deserialize SomeNonSerializableClass here

            reader.ReadEndElement();
        }
        else if (reader.Name == "ClassA")
        {
            reader.ReadStartElement();
            var serializer = new XmlSerializer(typeof(SomeSerializableClass));
            ClassA = (SomeSerializableClass)serializer.Deserialize(reader);
            reader.ReadEndElement();
        }
    }
    while (reader.Name != "SomeClass");

    reader.ReadEndElement();
}

public void WriteXml(XmlWriter writer)
{
    writer.WriteStartElement("ClassB");
    // manually serialize SomeNonSerializableClass here
    writer.WriteEndElement();

    writer.WriteStartElement("ClassA");
    var serializer = new XmlSerializer(typeof(SomeSerializableClass));
    serializer.Serialize(writer, ClassA);
    writer.WriteEndElement();
}