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