null許容フィールドの逆シリアル化に関する多くの投稿を読みましたが、次のシナリオに遭遇していません。
- 値を含むnull許容フィールドを使用してオブジェクトをシリアル化します(「nil」属性には値が含まれているため、ノードに追加されません)。
- xmlのnull許容フィールドから値を削除します(これはクライアント側の処理を介して行われます)。
- xmlを逆シリアル化します。
ステップ3は、シリアライザーがnull許容フィールドの空の値をnull値として処理しないため(「nil = true」が指定されていないため)、エラーをスローします。代わりに、値をフィールドのデータ型(例:GUID)に変換しようとしますが、失敗すると、フィールドのデータ型によって異なるエラーメッセージが表示されます。
Guidの場合、エラーメッセージは次のとおりです。
System.InvalidOperationException: There is an error in XML document ([line number], [column number]). ---> System.FormatException: Unrecognized Guid format.
私たちが使用するシリアル化/逆シリアル化メソッドは、ジェネリックを使用するフレームワークメソッドであることに注意してください。
エレガントで一般的なソリューションを探しています。私が考えることができる唯一の実行可能な一般的な解決策は次のとおりです。
- xmlをXDocumentに変換します。
- 参照型であるオブジェクトのすべてのプロパティを取得するには、(必要とは言えない)リフレクションを使用します。
- #2のリストで名前が見つかり、値が空のすべてのノードに「nil=true」属性を追加します。
- 再帰を使用して、#2の各参照型を処理します。
注:空の値を持つすべてのノードに「nil = true」を追加するだけでは機能しません。これは、シリアライザーがnullにできない値の型に対してエラーをスローするためです。
[編集]コード例:
サンプルデータクラス
public class DummyData
{
public Guid? NullableGuid { get; set; }
}
Xmlがクライアントに送信されました
<DummyData>
<NullableGuid>052ec82c-7322-4745-9ac1-20cc4e0f142d</NullableGuid>
</DummyData>
クライアントから返されたXml(エラー)
<DummyData>
<NullableGuid></NullableGuid>
</DummyData>
クライアントから返されたXml(望ましい結果)
<DummyData>
<NullableGuid p2:nil="true" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance"></NullableGuid>
</DummyData>