59

XML にシリアル化されたいくつかのオブジェクトをリファクタリングしていますが、下位互換性のためにいくつかのプロパティを保持する必要があります。古いオブジェクトを新しいオブジェクトに変換し、廃止されたプロパティを null にするメソッドがあります。この属性を使用して、Obsolete他の開発者にこのプロパティを使用しないように伝えたいのですが、XmlSerializer.

類似コード:

[Serializable]
public class MySerializableObject
{
    private MyObject _oldObject;
    private MyObject _anotherOldObject;

    private MyObject _newBetterObject;

    [Obsolete("Use new properties in NewBetterObject to prevent duplication")]
    public MyObject OldObject
    {
      get { return _oldObject; }
      set { _oldObject = value; }
    }

    [Obsolete("Use new properties in NewBetterObject to prevent duplication")]
    public MyObject AnotherOldObject
    {
      get { return _anotherOldObject; }
      set { _anotherOldObject = value; }
    }

    public MyObject NewBetterObject
    {
      get { return _anotherOldObject; }
      set { _anotherOldObject = value; }
    } 
}

回避策に関するアイデアはありますか?私の最善の解決策は、XML コメントに obsolete を書くことです...

更新: .NET 2.0 を使用しています

4

6 に答える 6

41

編集: MS Connect の記事を読んだ後、.Net 2.0 には、ドキュメントでの通知なしに ObsoleteAttribute を XmlIgnoreAttribute と同等にする「機能」があるようです。したがって、この場合にケーキを食べて食べる唯一の方法は、@Willのアドバイスに従い、シリアライゼーションを手動で実装することだと答えを修正します。これは、廃止されたプロパティを XML に含めるための唯一の将来の証明となる方法です。.Net 2.0 ではきれいではありませんが、.Net 3.0+ では作業が楽になります。

XmlSerializerから:

Obsolete 属性でマークされたオブジェクトがシリアル化されなくなった .NET Framework 3.5 では、XmlSerializer クラスは [Obsolete] としてマークされたオブジェクトをシリアル化しなくなりました。

于 2008-12-01T14:34:43.937 に答える
3

私はこれにかなり苦労しました-手動でシリアル化を行うか、別のシリアライザーを使用する以外に解決策はありません。

ただし、廃止されたプロパティごとに shim を作成するとすぐに面倒になる代わりに、Obsoleteプロパティ名にプレフィックスを追加することを検討できます (例: Foobecome ObsoleteFoo。これにより、属性のようにコンパイラの警告が生成されることはありませんが、少なくともコードでは表示されます。

于 2013-07-23T19:50:14.863 に答える
2

1) WAG: プロパティに XmlAttributeAttribute を追加してみてください。おそらく、これは ObsoleteAttribute をオーバーライドします。
2) PITA: IXmlSerializable を実装します。

于 2008-12-01T14:35:25.620 に答える
0

次の回避策を試すことができます。

という名前のメソッドを追加します

ShouldSerializeOldObject ()
{
   return true;
}

ShouldSerializeAnotherOldObject ()
{
   return true
}

これは廃止された属性をオーバーライドする可能性があります

于 2008-12-01T14:45:49.140 に答える