如何使用XmlInclude动态指定类型?

时间:2016-01-12 11:46:23

标签: c# xml object xmlinclude

我使用了这些类:

namespace defaultNamespace
{
    ...
    public class DataModel
    {
    }
    public class Report01
        {get; set;}
    public class Report02
        {get; set;}
}

我有一个方法可以在下面创建XML。

public XmlDocument ObjectToXml(object response, string OutputPath)
{
    Type type = response.GetType();
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(type);
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream, Encoding.UTF8);
    serializer.Serialize(writer, response);
    XmlDocument xmldoc = new XmlDocument();
    stream.Position = 0;
    StreamReader sReader = new StreamReader(stream);
    xmldoc.Load(sReader);
    stream.Position = 0;
    string tmpPath = OutputPath;
    while (File.Exists(tmpPath))
    {
        File.Delete(tmpPath);
    }
    xmldoc.Save(tmpPath);
    return xmldoc;
}

我有两个包含Report01和Report02对象的列表。

List<object> objs = new List<object>();
List<object> objs2 = new List<object>();

Report01 obj = new Report01();
obj.prop1 = "aa";
obj.prop2 = "bb";
objs.Add(obj);

Report02 obj2 = new Report02();
obj2.prop1 = "cc";
obj2.prop2 = "dd";
objs2.Add(obj2);

当我尝试像这样创建XML时:

ObjectToXml(objs, "c:\\12\\objs.xml");
ObjectToXml(objs2, "c:\\12\\objs2.xml");

我看到了这个例外:

  

预计不会出现“Report01(或Report02)”类型。使用XmlInclude   或SoapInclude属性指定未知的类型   静态。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

这是因为您的response.GetType()实际返回List<object>类型,然后您尝试序列化非预期类型。 Object Object无法了解您的类型和序列化程序XmlInclude无法序列化您的未知类型。

您可以将BaseClass用于报告,[XmlInclude(typeof(Report01)] [XmlInclude(typeof(Report02)] public class BaseClass { } public class Report01 : BaseClass { ... } public class Report02 : BaseClass { ... } List<BaseClass> objs = new List<BaseClass>(); List<BaseClass> objs2 = new List<BaseClass>(); // fill collections here ObjectToXml(objs, "c:\\12\\objs.xml"); ObjectToXml(objs2, "c:\\12\\objs2.xml"); 可以解决此异常:

if (Marshal.IsComObject(oWordApp))
{
    Marshal.ReleaseComObject(oWordApp);
}
相关问题