一位网友碰到的问题 顺手解决了下 这里做下备忘
问题: 使用XmlSerializer在对一个对象序列化成XML操作时出现了报错 错误信息如下:
System.InvalidOperationException:“反射类型“YuanTK.DicomPrintSCP.Demo.Program.Zzjpara”时出错。”
InvalidOperationException: 类型“YuanTK.DicomPrintSCP.Demo.Program.Request2203A.Input”和“YuanTK.DicomPrintSCP.Demo.Program.Request2201.Input”都使用来自命名空间“”的 XML 类型名称“Input”。请使用 XML 特性为该类型指定唯一的 XML 名称和/或命名空间。
原来的实体类差不多是这样的
public class Zzjpara
{
public Request2201 request2201 { get; set; }
public Request2203A request2203A { get; set;}
}
public class Request2203A
{
public Input input { get; set; }
public class Input
{
public string xxx { get; set; }
}
}
public class Request2201
{
public Input input { get; set; }
public class Input
{
public int xxx { get; set; }
}
}
可以看到Zzjpara这个类里面存在两个子属性类 每个子类里面存在同名属性 Input 之所以报错就是这个属性导致的,当对Zzjpara 对象进行序列化xml就会报上面的错误
在不能修改子类属性名的情况下 想要对这个实体进行序列化xml 的解决办法如下
给子类的的input添加扩展属性用命名空间来给属性进行区分 这样就可以序列化xml了 代码如下:
public class Zzjpara
{
public Request2201 request2201 { get; set; }
public Request2203A request2203A { get; set;}
}
public class Request2203A
{
[XmlElement(Namespace = "input1")]//这里Namespace 不能一样
public Input input { get; set; }
public class Input
{
public string xxx { get; set; }
}
}
public class Request2201
{
[XmlElement(Namespace = "input2")]//这里Namespace 不能一样
public Input input { get; set; }
public class Input
{
public int xxx { get; set; }
}
}
再执行XmlSerializer 就不报错可以正常序列化成xml了
XmlSerializer xs = new XmlSerializer(zzjpara.GetType());
string xml = "D:/Myxml.xml";
TextWriter tw = new StreamWriter(xml);
xs.Serialize(tw, zzjpara);
tw.Close();
string xmlString = System.IO.File.ReadAllText(xml);