gpt4 book ai didi

c# - 在控制生成的 XML 元素的同时对派生类使用 C# xmlserializer

转载 作者:太空宇宙 更新时间:2023-11-03 11:42:48 25 4
gpt4 key购买 nike

我有一个 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 中实现接口(interface)关于 myItem 成员的类型?

感谢您的帮助!

最好的问候,花

最佳答案

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

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

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

最好的,花

关于c# - 在控制生成的 XML 元素的同时对派生类使用 C# xmlserializer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4285242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com