我有一个非标准的XML,包括模板(默认值)和指定的字段。作为一个例子总是受到欢迎:
<MyClass>
<ArrayOfSubClass>
<SubClass>
<Par1>1</Par1>
<Par2>2</Par2>
<Par3>3</Par3>
<ArrayOfSpecific>
<Specific>
<Par1>11</Par1>
</Specific>
</ArrayOfSpecific>
</SubClass>
</ArrayOfSubClass>
</MyClass>
我想将此类MyClass
反序列化为一个对象。如您所见,MyClass
是类SubClass
的集合,它有三个参数和一组类Specific
。类SubClass
和Specific
来自同一个母班。
什么特定我希望找到默认值(即SubClass
中找到的值),除非给出一个字段。到目前为止我所做的是实现一个方法,通过反射检查类Specific
的属性是否具有属性类型的默认值,并将其替换为SubClass
的属性,如果它是案件。它运作良好,但我没有涵盖所有情况。例如,假设我在Par1
中有双重属性SubClass
的值,比如Par1 = 1.234
,但我希望它现在是0
。问题是0
是double类型的默认值,所以使用my方法我会在SubClass
中检索属性的值。
最好先将MyClass
对象反序列化,然后将类Specific
的所有属性与SubClass
中相同属性的值放在一起,然后再将其反序列化为现有对象,它只会更改XML文件中给出的属性。
这很棘手,我可以想象我的问题不容易理解......
[编辑:]为了更容易理解,这是我反复序列化后的结果
<MyClass>
<ArrayOfSubClass>
<SubClass>
<Par1>1</Par1>
<Par2>2</Par2>
<Par3>3</Par3>
<ArrayOfSpecific>
<Specific>
<Par1>11</Par1>
<Par2>2</Par2>
<Par3>3</Par3>
</Specific>
</ArrayOfSpecific>
</SubClass>
</ArrayOfSubClass>
</MyClass>
在反序列化后通过反射完成,如果Specific
的属性具有默认值,则获取类SubClass
的值。棘手的情况如下
<MyClass>
<ArrayOfSubClass>
<SubClass>
<Par1>1</Par1>
<Par2>2</Par2>
<Par3>3</Par3>
<ArrayOfSpecific>
<Specific>
<Par1>0</Par1> <----- 0 is the default value of a double
</Specific>
</ArrayOfSpecific>
</SubClass>
</ArrayOfSubClass>
</MyClass>
目前结果将是
<MyClass>
<ArrayOfSubClass>
<SubClass>
<Par1>1</Par1>
<Par2>2</Par2>
<Par3>3</Par3>
<ArrayOfSpecific>
<Specific>
<Par1>1</Par1> <---- as 0 is the default value of a double, this property is set to the value of the SubClass
<Par2>2</Par2>
<Par3>3</Par3>
</Specific>
</ArrayOfSpecific>
</SubClass>
</ArrayOfSubClass>
</MyClass>
但我想要
<MyClass>
<ArrayOfSubClass>
<SubClass>
<Par1>1</Par1>
<Par2>2</Par2>
<Par3>3</Par3>
<ArrayOfSpecific>
<Specific>
<Par1>0</Par1>
<Par2>2</Par2>
<Par3>3</Par3>
</Specific>
</ArrayOfSpecific>
</SubClass>
</ArrayOfSubClass>
</MyClass>
答案 0 :(得分:0)
以下是可能有益的序列化CodeProject链接的集合:
虽然我不确定我理解你的问题,但你能不能使你的类可序列化,并且在MyClass示例中,为相应的值编写序列化代码?
答案 1 :(得分:0)
好的,我找到了解决问题的解决方法。我做了两件事(实际上是三件)的步骤。首先,我将XML反序列化为我的类。其次,我将Specific
类的所有属性都设置为我在SubClass
中通过反射找到的默认值,期望一个字段(Specific
类的If)。第三,我将XML重新加载到DataSet
。在那里,我查看名为DataTable
的{{1}},对于我的类的所有属性,我查看是否有任何相同名称的列,如果单元格包含值,我将其放入我的类。
奥弗夫! 不是很美,但它确实有效。
Specific
和Voila