次のようなutf-8でエンコードされたxmlメッセージとしてサーバーからデータを受信します
<?xml version="1.0" encoding="utf-8"?>
<Data namespace="http://example.com/data">
...
</Data>
この例で注目すべき点は、「namespace」修飾子は、実際にはデフォルトの xml 名前空間を指定する「xmlns」修飾子でなければならないということです。シリアライゼーション/デシリアライゼーションのコードは、スキーマ定義ファイルから (自動) 生成されました。xsd とそれに付随するドキュメントの両方が、これがバグであることをほぼ確認しています。
ただし、これは、Data オブジェクトがグローバル/空の名前空間 (xmlns="") に存在するようになり、自動生成されたコードが、逆シリアル化中に XmlSerialzier がスローする典型的な種類の例外で"There is an error in XML document ..."
失敗することも意味します。"<Data xmlns=''> was not expected."
属性/コードと xml ドキュメントが一致しません。
Namespace
自動生成されたコードを変更し、定義を「ホットフィックス」するのはかなり簡単ですが、たとえば
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class Data {
私が本当に望んでいるのは名前空間の回復力Namespace
です。つまり、将来のある時点で、データを提供してくれた人によって問題が修正された場合、コード内の定義を再度適用することを余儀なくされたくありません(xmlns の変更前述の例外で逆シリアル化コードが壊れます)。
つまり、上記の欠陥のある xml と、たとえば両方を処理できるコードが必要です。
<?xml version="1.0" encoding="utf-8"?>
<Data xmlns="http://example.com/data">
...
</Data>
または(たとえば、「下位互換性」を維持することを決定した場合)
<?xml version="1.0" encoding="utf-8"?>
<Data xmlns="http://example.com/data" namespace="http://example.com/data">
...
</Data>
どのようなオプションがありますか?