テンプレート (デフォルト値) と指定されたフィールドを含む非標準の 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
3 つのパラメーターとクラスのコレクションを持つクラスのコレクションですSpecific
。クラスSubClass
とSpecific
は、同じマザー クラスから派生します。
ISpecific フィールドが指定されていない場合、デフォルト値 (つまり、 で見つかった値) を見つけたいと思いますSubClass
。私がこれまでに行ったことは、クラスSpecific
のプロパティにプロパティ タイプのデフォルト値があるかどうかをリフレクションによってチェックし、そうである場合はそれをのプロパティに置き換えるメソッドを実装するSubClass
ことです。非常にうまく機能しますが、すべてのケースをカバーしているわけではありません。たとえば、 に double プロパティの値があるとPar1
します。問題は、それが double 型のデフォルト値であるため、私の方法では、.SubClass
Par1 = 1.234
0
0
SubClass
最初にオブジェクトをデシリアライズしてから、同じプロパティの値を持つMyClass
クラスのすべてのプロパティを に配置し、この既存のオブジェクトにデシリアライズして、XML ファイルで指定されたプロパティのみを変更するのが最善でした。Specific
SubClass
非常にトリッキーなので、私の質問が理解しにくいと想像できます...
[編集:] わかりやすくするために、デシリアライズした結果を次に示します。
<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>