5

Microsoft のBest Practices: Data Contract Versioningを読んでいて、次のように述べています。

以前のバージョンでIsRequiredプロパティがデフォルト プロパティのfalseのままだったとしても、新しいバージョンではデータ メンバーを削除しないでください。

誰でもこれの理由を提案できますか? 彼らは詳しく説明しません。新しいバージョンではデータ メンバーを追加しても問題ないと言われているので、削除しても問題ないようです。事実上、古いバージョンでは追加と見なされます。

違いは、(DataMemberAttribute の Order プロパティを使用して) 最後に新しいメンバーを追加することになっているのに対し、削除されるプロパティはおそらく最後ではないということです。しかし、欠落しているメンバーはロード中にデフォルト値のままになるとも言われているため、欠落しているメンバーが問題ないことは明らかです。

私は何が欠けていますか?製品の機能を廃止し、それに付随する [DataMember] プロパティを削除した場合、どのようなバージョン相互運用の問題 (前方互換性と後方互換性の両方) が発生しますか?

また、前方互換性に関心がないと判断した場合 (つまり、古いバージョンが新しいファイルを開くことに関心がない場合)、そのような問題は引き続き適用されますか?

4

2 に答える 2

2

外部のサービス利用者がそのデータを提供/使用する可能性があるためです(一部のメンバーを削除する前に作成されたものです)。サービスメソッドの署名を変更した場合、データメンバーが不明なため、DataContractSerializer認識できなくなります。DataContract

したがって、サービスの利用者がすべてわかっている場合は、次の条件を満たしていれば、データ メンバーを自分の意思で簡単に操作できます。

  • 消費者を壊したり、
  • 変更を適切に知らせる
于 2009-05-13T12:19:01.157 に答える
2

1 つの問題は、シリアライゼーション/デシリアライゼーション中に壊れていなくても、データを破棄している可能性があることです。つまり、データを呼び出し元に正常に往復させることができないということです。つまり、単純な方法が与えられます:

public SomeType Echo(SomeType obj) {
    return obj;
}

呼び出し元が余分なプロパティを持つ古いオブジェクトを渡している場合、その値を戻したいと思うかもしれません。拡張データAPI を使用してこれを (個別に) 有効にすることができますが、率直に言って、これを気にする人はほとんどいません。

于 2009-05-13T12:22:29.577 に答える