【发布时间】:2018-12-12 19:07:51
【问题描述】:
我正在使用 XmlSerializer 反序列化来自远程 API 的 XML 响应。有许多标准的预定义类,我已经为它们建立了类。响应的关键部分如下所示:
<data>
<employee>
<name>John Doe</name>
<id>E1</id>
....
</employee>
<employee>
....
</employee>
....
</data>
或
<data>
<customer>
<name>Yoyodyne Systems</name>
<id>C1</id>
....
</customer>
<customer>
....
</customer>
....
</data>
所以我有 Customer 和 Employee 类,Data 类的属性定义如下:
[XmlElement("customer", typeof(Customer))]
public List<Customer> Customers { get; set; }
[XmlElement("employee", typeof(Employee))]
public List<Employee> Employees { get; set; }
每个结果的数据元素只包含一种类型的标签,而且我通常知道从给定请求中预期会返回哪一个,所以我只访问该属性并忽略其他留空的属性。
但我想让它更具可扩展性;特别是远程应用程序的不同实例中可能包含自定义类,我不想将它们全部放入基本代码包中。我希望我可以向 Data 类添加一个属性,例如
public List<object> ExtensionObjects { get; set; }
然后使用XmlSerializer(Type, Type[]) 构造函数来提供我想要反序列化的实际类型。但是,我不知道如何告诉它将此应用于任何未知标签,甚至指定标签。例如,如果我有一个自定义 Office 类,我怎样才能将 <office>...</office> 标签反序列化到其中?有没有一种方法可以让我使用 XmlSerializer 做到这一点,而不必一直回到将所有内容解析为 XDocument?
编辑:
似乎很有希望的一件事是尝试处理 OnUnknownElement 事件。我可以为它创建一个委托,然后通过 XmlDeserializationEvents 对象将其传递给 Deserialize 方法调用。现在我只需要找出将这些未知元素转化为我的扩展类实例的最佳方法。
【问题讨论】:
标签: c# xmlserializer