嘿,我在构建一个XmlSerializer时遇到了麻烦,其中额外的类型包含具有相同Name(但是唯一的Fullname)的类型。下面是一个说明我的场景的例子。
外部程序集中的类型定义我无法操作:
public static class Wheel
{
public enum Status { Stopped, Spinning }
}
public static class Engine
{
public enum Status { Idle, Full }
}
我写过的课程并且可以控制:
public class Car
{
public Wheel.Status WheelStatus;
public Engine.Status EngineStatus;
public static string Serialize(Car car)
{
var xs = new XmlSerializer(typeof(Car), new[] {typeof(Wheel.Status),typeof(Engine.Status)});
var output = new StringBuilder();
using (var sw = new StringWriter(output))
xs.Serialize(sw, car);
return output.ToString();
}
}
XmlSerializer构造函数抛出带有Message
的System.InvalidOperationException“反映类型'Engine.Status'的错误”
此异常具有System.InvalidOperationException类型的InnerException和Message
“类型'Wheel.Status'和'Engine.Status'都使用来自命名空间''的XML类型名称'Status'。使用XML属性为该类型指定唯一的XML名称和/或名称空间。”
鉴于我无法改变枚举类型,我如何构建一个能够成功序列化Car的XmlSerializer?
答案 0 :(得分:0)
我注意到的第一件事是Car.Status
不存在。你的意思是Engine.Status
?
在任何情况下,如果这些枚举类型的设计方式无法自动序列化,则必须手动将它们序列化。
答案 1 :(得分:0)
你可以通过在每个类上实现IXmlSerializable接口来序列化它,然后你将得到3个方法
GetSchema()
ReadXml()
WriteXml()
在GetSchema方法中简单地放入return null;
并在WriteXml()方法中放入编译xml所需的代码,同时序列化对象,并在ReadXml()方法中放入你需要的代码来读取ffrom xml文件和在反序列化时重新创建对象。
答案 2 :(得分:0)
尝试使用XmlElement属性:
public class Car
{
[XmlElement("WheelStatus")]
public Wheel.Status WheelStatus;
[XmlElement("EngineStatus")]
public Engine.Status EngineStatus;
...
}
更新:刚试过这个,在这种情况下似乎没有用。
答案 3 :(得分:0)
您可以在变量“状态”的正上方添加一个[XmlElement(Name = "WheelStatus")]
来避免该问题。
这会强制将保存时的xml名称(以及加载时的预期名称)重命名为您在“名称”中输入的任何字符串。但这还可以让您保留变量名“状态”