gpt4 book ai didi

c# - 使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型

转载 作者:IT王子 更新时间:2023-10-29 03:38:49 28 4
gpt4 key购买 nike

在使用 .NET 的 XmlSerializer 时,我遇到了一个非常奇怪的问题。

采用以下示例类:

public class Order 
{
public PaymentCollection Payments { get; set; }

//everything else is serializable (including other collections of non-abstract types)
}

public class PaymentCollection : Collection<Payment>
{
}

public abstract class Payment
{
//abstract methods
}

public class BankPayment : Payment
{
//method implementations
}

据我所知,有三种不同的方法可以解决由于序列化程序不知道 Payment 的派生类型而导致的 InvalidOperationException

<强>1。将 XmlInclude 添加到 Payment 类定义中:

这是不可能的,因为所有类都作为我无法控制的外部引用包含在内。

<强>2。在创建 XmlSerializer 实例

期间传递派生类型的类型

不起作用。

<强>3。为目标属性定义 XmlAttributeOverrides 以覆盖属性的默认序列化(如 this SO post 中所述)

也不起作用(XmlAttributeOverrides 初始化如下)。

Type bankPayment = typeof(BankPayment);

XmlAttributes attributes = new XmlAttributes();
attributes.XmlElements.Add(new XmlElementAttribute(bankPayment.Name, bankPayment));

XmlAttributeOverrides overrides = new XmlAttributeOverrides();
overrides.Add(typeof(Order), "Payments", attributes);

然后将使用适当的 XmlSerializer 构造函数。

注意:不起作用我的意思是 InvalidOperationException(BankPayment 不是预期的... ) 被抛出。

任何人都可以阐明这个主题吗?如何进一步调试问题?

最佳答案

这对我有用:

[XmlInclude(typeof(BankPayment))]
[Serializable]
public abstract class Payment { }

[Serializable]
public class BankPayment : Payment {}

[Serializable]
public class Payments : List<Payment>{}

XmlSerializer serializer = new XmlSerializer(typeof(Payments), new Type[]{typeof(Payment)});

关于c# - 使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11886290/

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