继承对象的XML反序列化

时间:2009-10-25 04:26:48

标签: c# xml inheritance serialization

我有一个对象InputFile,它有数组和对象来保存文件的内容。我还从ABCFile继承了XYZFileInputFile,它们将读取不同类型的文件并将其存储到InputFile的预计成员中。

由于这两个对象的序列化和反序列化与父对象相同,因此我在父对象上实现了标准的XML序列化接口。在反序列化期间,会读取一些参数,调用Read函数(加载文件),然后反序列化完成。

序列化效果很好,但反序列化(List<InputFile>)不起作用,因为反序列化器调用父节点Read文件函数而不是ABCFileXYZFile的。

如何让反序列化识别正确使用的对象类型?我的List<InputFile>可能会混合使用各种文件类型。

由于

我用来序列化对象的代码:

public class InputFileHolder : IXmlSerializable {
...
public void WriteXml(XmlWriter w) {
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");

    XmlSerializer ifXml = new XmlSerializer(typeof(List<InputFile>));
    ifXml.Serialize(w, InputFiles, ns);

    //More serialization
}

我自定义序列化List时如何维护对象类型的任何想法?

1 个答案:

答案 0 :(得分:7)

尝试

[XmlArray]
[XmlArrayItem(ElementName="ABCFile", Type=typeof(ABCFile))]
[XmlArrayItem(ElementName="XYZFile", Type=typeof(XYZFile))]
public List<InputFile> InputFileList
{
   get;
   set;
}

这将指示序列化程序,即使这是一个InputFile列表,也会有两个派生类型存储在此列表中。它可能会使每个方法使用特定版本的方法。

如果失败,请告诉我。

根据您的评论进行修改

我不知道这是怎么回事。

我测试了以下几个类:

public class InputFile
{
    public String InputfileCommonProperty { get; set; }
}

public class ABCFile : InputFile
{
    public String ABCSpecificProperty { get; set; }
}

public class XYZFile : InputFile
{
    public String XYZSpecificProperty { get; set; }
}

public class InputFileHolder
{
    public InputFileHolder()
    {
        InputFileList = new List<InputFile>();
    }

    [XmlArray]
    [XmlArrayItem(ElementName = "ABCFile", Type = typeof(ABCFile))]
    [XmlArrayItem(ElementName = "XYZFile", Type = typeof(XYZFile))]
    public List<InputFile> InputFileList { get; set; }
}

我的主程序如下:

static void Main(string[] args)
{
    InputFileHolder fileHolder = new InputFileHolder();
    fileHolder.InputFileList.Add(
        new ABCFile()
        {
            InputfileCommonProperty = "This is a common property",
            ABCSpecificProperty = "This is a class specific property"
        });

    XmlSerializer serializer = new XmlSerializer(typeof(InputFileHolder));
    MemoryStream memoryStream = new MemoryStream();
    serializer.Serialize(memoryStream, fileHolder);

    System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
    String serializedString = enc.GetString(memoryStream.ToArray());
}

最后,serializedString的内容是:

<?xml version="1.0"?>
<InputFileHolder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <InputFileList>
    <ABCFile>
      <InputfileCommonProperty>This is a common property</InputfileCommonProperty>
      <ABCSpecificProperty>This is a class specific property</ABCSpecificProperty>
    </ABCFile>
  </InputFileList>
</InputFileHolder>
你知道吗?序列化器知道它是ABCFile而不是通用的InputFile。