代码之家  ›  专栏  ›  技术社区  ›  NoizWaves

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

  •  0
  • NoizWaves  · 技术社区  · 16 年前

    嘿,我在构造XmlSerializer时遇到了问题,其中额外的类型包含具有相同名称(但唯一全名)的类型。下面是一个说明我的场景的例子。

    无法操作外部程序集中的类型定义:

    public static class Wheel
    {
      public enum Status { Stopped, Spinning }
    }
    
    public static class Engine
    {
      public enum Status { Idle, Full }
    }
    

    I类已编写并控制:

    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();
      }
    }
    

    “反射类型时出错”发动机状态'"

    “类型”车轮状态'和'发动机状态“”两者都使用命名空间“”中的XML类型名称“Status”。使用XML属性为类型指定唯一的XML名称和/或命名空间。“

    4 回复  |  直到 16 年前
        1
  •  0
  •   Charlie Salts    16 年前

    Car.Status 不存在。你是说 Engine.Status ?

    在任何情况下,如果这些枚举类型的设计方式无法自动序列化,则必须手动序列化它们。

        2
  •  0
  •   viky    16 年前

    您可以通过在每个类上实现IXmlSerializable接口来序列化它,然后您将得到3个方法

    GetSchema()
    ReadXml()
    WriteXml()
    

    在GetSchema方法中,只需将 return null;

        3
  •  0
  •   Chris Dunaway    16 年前

    尝试使用XmlElement属性:

    public class Car
    {
        [XmlElement("WheelStatus")]
        public Wheel.Status WheelStatus;
        [XmlElement("EngineStatus")]
        public Engine.Status EngineStatus;
    
        ...
    
    }
    

        4
  •  0
  •   Stephen Rauch Afsar Ali    8 年前

    你可以加一个 [XmlElement(Name = "WheelStatus")] 就在你的变量“状态”上面避免这个问题。

    这将强制将保存时的xml名称(以及加载时预期的名称)重命名为您在“name”中输入的任何字符串。但这也允许您保留变量名“status”