如何以编程方式将 XmlAttribute 声明添加到现有类的成员?

问题描述 投票:0回答:1

我正在尝试使用

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
属性后,我认为这很简单;唉,现实却并非如此。我希望我只是忽略了一些密集而明显的东西。

c# xml xml-deserialization
1个回答
0
投票

我已经解决了这个问题。

对于类的每个成员,我需要从 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);
...
© www.soinside.com 2019 - 2024. All rights reserved.