【发布时间】:2013-01-10 19:29:10
【问题描述】:
我有一个包含模板(默认值)和指定字段的非标准 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 类派生自同一个母类。
什么 ISpecific 我希望找到默认值(即在SubClass 中找到的值),除非给出了一个字段。到目前为止,我所做的是实现一种方法,该方法通过反射检查 Specific 类的属性是否具有属性类型的默认值,如果是这种情况,则将其替换为 SubClass 的属性。它工作得很好,但我没有涵盖所有情况。例如,假设我在SubClass 中有一个双重属性Par1 的值,比如Par1 = 1.234,但我希望它现在是0。问题是0 是double 类型的默认值,所以用我的方法我会检索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 是 double 类型的默认值,所以用我的方法我会检索子类中属性的值。” ,你是什么意思,为什么这是一个问题?如果您只是将此值设置为零会发生什么?
-
你用什么语言做这个?该帖子标记为“c”,但由于您提到了类和反射,我猜它是别的东西。
-
@Ramy :反序列化后,如果属性具有默认值,我将
SubClass的值复制到Specific中。 double 的默认值为 0。问题是当我在Specific中找到值为 0 的属性时,我怎么知道它是真的 0 还是默认值??
标签: c# xml deserialization