XmlSerializer构造具有相同的命名额外类型

时间:2009-12-19 04:31:25

标签: c# .net xml-serialization

嘿,我在构建一个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?

4 个答案:

答案 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名称(以及加载时的预期名称)重命名为您在“名称”中输入的任何字符串。但这还可以让您保留变量名“状态”

相关问题