![](/img/trans.png)
[英]Use the XmlInclude or SoapInclude attribute to specify types that are not known statically
[英]How to use XmlInclude to specify types dynamically?
我有以下这些类:
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属性可以指定静态未知的类型。
我怎么解决这个问题?
这是因为您的response.GetType()
实际上返回List<object>
类型,然后尝试序列化非预期类型。 Object
对您的类型一无所知,而Object
序列化程序无法对未知类型进行序列化。
您可以将BaseClass用于报告,而XmlInclude
可以解决此异常:
[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");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.