我正在尝试使用
XmlSerializer
的 Deserialize 方法将 XML 节点(从基本文本文件)反序列化为现有 C# 类的实例。反序列化无法填充现有类的任何成员。
我的假设是,现有的类成员中没有一个被
[XmlAttribute]
装饰。已经以编程方式应用了 XmlIgnore
装饰,我认为同样的方法也适用于 XmlAttribute
:利用 XmlAttributeOverrides
类并定义 XmlAttributeAttribute
,如下所示(MyClass
是我无法修改的现有/定义的类) ),并且 my_record_id
只是我想要的类中的许多示例字段之一反序列化。
请注意,为了简洁和实用,代码必须被缩写/截断/摘录。
// The XML (representative)
<MyClass my_record_id="1" otherfield="othervalue" ..../>
然后我构建此代码以将
XmlAttribute
添加到 my_record_id
字段
XmlAttributes wbAttributes = new XmlAttributes();
wbAttributes.XmlAttribute = new XmlAttributeAttribute("XmlAttribute");
XmlRootAttribute xroot = new XmlRootAttribute("MyClass");
XmlAttributeOverrides xOver = new XmlAttributeOverrides(); //used succesfully for XmlIgnore attribs
xOver.Add(typeof(MyClass), "my_record_id", wbAttributes);
然后我通过调用以下内容来执行反序列化
static T DeserializeXML<T>(string xml,XmlAttributeOverrides overrides, XmlRootAttribute root)
{
var serializer = new XmlSerializer(typeof(T), overrides,null,root,"");
return (T)serializer.Deserialize(XmlReader.Create(new StringReader(xml)));
}
// xmlString taken from file, that code omitted
MyClass c = DeserializeXML<MyClass>(xmlString, xOver,xroot);
这是失败的反序列化。反序列化时不会填充类中的
my_record_id
字段(如代码中所示)。我假设我没有正确应用 [XmlAttribute]
,但我根本不确定我哪里出错了。也许我为此目的完全错误地使用了XmlAttributeOverrides
。
我的最终目的是实现我不能对现有类所做的事情,即以这种方式直接修改它:
public class MyClass
{
[XmlAttribute]
public int my_record_id;
}
我已经对此类问题进行了多次搜索,但大多数解决方案都假定能够修改实际的类定义,但在这些情况下这是不可能的。在其他不相关的字段上“注入”
XmlIgnore
属性后,我认为这很简单;唉,现实却并非如此。我希望我只是忽略了一些密集而明显的东西。
我已经解决了这个问题。
对于类的每个成员,我需要从 XmlAttributeAttribute 实例化中删除名称参数。
这将代码减少为:
XmlAttributes wbAttributes = new XmlAttributes();
wbAttributes.XmlAttribute = new XmlAttributeAttribute();
XmlAttributeOverrides xOver = new XmlAttributeOverrides();
xOver.Add(typeof(MyClass), "my_record_id", wbAttributes);
xOver.Add(typeof(MyClass), "other_field_1", wbAttributes);
xOver.Add(typeof(MyClass), "other_field_2", wbAttributes);
...