Xml反序列化和默认值

时间:2013-01-10 19:29:10

标签: c# xml deserialization

我有一个非标准的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。类SubClassSpecific来自同一个母班。

什么特定我希望找到默认值(即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>

2 个答案:

答案 0 :(得分:0)

以下是可能有益的序列化Code​​Project链接的集合:

虽然我不确定我理解你的问题,但你能不能使你的类可序列化,并且在MyClass示例中,为相应的值编写序列化代码?

答案 1 :(得分:0)

好的,我找到了解决问题的解决方法。我做了两件事(实际上是三件)的步骤。首先,我将XML反序列化为我的类。其次,我将Specific类的所有属性都设置为我在SubClass中通过反射找到的默认值,期望一个字段(Specific类的If)。第三,我将XML重新加载到DataSet。在那里,我查看名为DataTable的{​​{1}},对于我的类的所有属性,我查看是否有任何相同名称的列,如果单元格包含值,我将其放入我的类。

奥弗夫! 不是很美,但它确实有效。

Specific

和Voila