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

C# 具有相同命名额外类型的XmlSerializer构造,c#,.net,xml-serialization,C#,.net,Xml Serialization,嘿,我在构造一个XmlSerializer时遇到了麻烦,在这个XmlSerializer中,额外的类型包含具有相同名称(但唯一全名)的类型。下面是一个说明我的场景的示例 无法操作外部程序集中的类型定义: I类已编写并控制: XmlSerializer构造函数引发System.InvalidOperationException,并显示消息 “反映类型‘Engine.Status’时出错” 此异常具有System.InvalidOperationException类型的InnerException和

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

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

I类已编写并控制:

XmlSerializer构造函数引发System.InvalidOperationException,并显示消息

“反映类型‘Engine.Status’时出错”

此异常具有System.InvalidOperationException类型的InnerException和with Message

类型“Wheel.Status”和“Engine.Status”都使用来自命名空间“”的XML类型名称“Status”。使用XML属性为该类型指定唯一的XML名称和/或命名空间


鉴于我无法更改枚举类型,如何构造一个能够成功序列化Car的XmlSerializer?

我注意到的第一件事是
Car.Status
不存在。你是说
引擎状态


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

可以通过在每个类上实现IXmlSerializable接口对其进行序列化,然后将得到3个方法

GetSchema()
ReadXml()
WriteXml()

在GetSchema方法中,只需将
返回null
和WriteXml()方法中放入序列化对象时编写xml所需的代码,并在ReadXml()方法中放入从xml文件读取并在反序列化时重新创建对象所需的代码

尝试使用XmlElement属性:

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

    ...

}

更新:刚刚尝试了这个,在这种情况下似乎不起作用。

您可以在变量“Status”的正上方添加一个
[xmlement(Name=“WheelStatus”)]
,以避免该问题

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

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

    ...

}