【问题标题】:Using C# xmlserializer on derived classes while controlling the generated XML element在派生类上使用 C# xmlserializer,同时控制生成的 XML 元素
【发布时间】:2010-11-26 12:21:14
【问题描述】:

我有一个 C# 类结构,其中包含一个抽象基类和从这个抽象类派生的各种类。

[System.Xml.Serialization.XmlInclude(typeof(B))]
public abstract class A {
 ...
}

[Serializable]
[XmlType("typename")]
public class B : A  {
 ...
}

此外,我在另一个 C 类中使用 B 类的实例作为其抽象类型如下的字段:

public class C {
    ...
    public A myItem { get; set; } //A is actually of type B
    ...
}

现在,当我通过标准 xmlserializer 序列化我的 C 类时,我得到了这样的 XML 结构:

<C>
    <myItem p2:type="typename" xmlns:p2="...">
     ... //Fields as elements and stuff
    </myItem>
</C>

但这不是我需要的,因为我将那些序列化的 C 对象发送到 REST Web 服务(还没有有效的模式)。我真正需要的是这样的:

<C>
    <typename>
     ... //Fields as elements and stuff
    </typename>
</C>

但正如您在上面看到的,xmlserializer 似乎更喜欢实例字段名称而不是通过 XmlType 设置的类型名称。另外,显然我不能只对 C 中的字段使用 XmlElement("typename"),因为我不知道该字段将包含我的抽象类 A 的哪个具体实现。

有没有人遇到过类似的问题并可以为我提供解决方案?或者我真的需要在我的 A 类中实现 IXmlSerializable 并因此在所有具体的 A 派生类中实现它吗?

编辑:刚刚在阅读一些文章时发现 IXmlSerializable 不允许我控制包装器元素,所以我实际上需要使用某种 switch() 在 C 类中实现接口关于 myItem 成员的类型?

感谢您的帮助!

最好的问候, 浮动

【问题讨论】:

    标签: c# xml serialization c#-3.0 xml-serialization


    【解决方案1】:

    好的,似乎我已经找到了解决方案,至少对于序列化,不知道这是否也适用于反序列化。 key 是 XMLElement 属性的特殊构造函数,如果使用抽象类型,它允许指定要使用的键:

    http://msdn.microsoft.com/en-us/library/cz6bdh5z.aspx

    也许这对其他人也有帮助。

    最好, 浮动

    【讨论】:

      【解决方案2】:

      对于反序列化,您需要向 XmlSerializer 提供它在所有抽象类型化属性中可能遇到的所有类型。

      XmlSerializer 有一个特定的构造函数,您可以在其中为其提供类型的集合。

      【讨论】:

      • 谢谢,但我实际上认为这已经通过指定 XmlInclude 属性来完成......但如果没有这个,它甚至似乎完全可以工作......以我需要存储特定于类的信息的价格C 类中的 B ......但我认为这是我无法为这些东西使用有效架构而必须付出的代价......
      • 啊,是的,我假设的情况与我们在工作中处理的情况相近:抽象属性和/或具有未知派生类的实例的 xml 反序列化。对于那些我们使用 MEF 收集派生类型并将它们提供给 XmlSerializer 进行反序列化。
      • 我明白了...这对我来说没问题,因为我知道我必须期待的所有类型,我只是无法更改 web 服务并且(不存在的)架构可能会更改,通过模式-> xsd.exe -> 类间接执行此操作也没有什么大意义,除了我只是为某种论文原型做这件事之外,我不希望被重用在我提供了我的结果之后 ;-) 感谢 MEF 的指针,虽然...不知道这个,看起来很有希望,可能会派上用场!
      猜你喜欢
      • 2018-01-30
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多