4

後方互換性と前方互換性を維持し、(可能であれば) 往復をサポートするために、アプリケーションで DataContractSerializer を使用しようとしています。

ラウンドトリップをサポートすることは可能ですか、そうでない場合は、次のシナリオで不明な型を無視することは可能ですか?

object 型のプロパティを持つクラス ClassWithObject があり、古いバージョンのアプリケーションがこのプロパティに CurrentAdditionalData 型のオブジェクトを格納したとします。

    [DataContract]
[KnownType(typeof(CurrentAdditionalData))]
public class ClassWithObject : IExtensibleDataObject
{
    #region IExtensibleDataObject Members
    private ExtensionDataObject extensionDataObject_value;
    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
    public ExtensionDataObject ExtensionData
    {
        get
        {
            return extensionDataObject_value;
        }
        set
        {
            extensionDataObject_value = value;
        }
    }
    #endregion

    [DataMember]
    public object AdditionalData { get; set; }
}

[DataContract]
public class CurrentAdditionalData : IExtensibleDataObject
{
    #region IExtensibleDataObject Members
    private ExtensionDataObject extensionDataObject_value;
    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
    public ExtensionDataObject ExtensionData
    {
        get
        {
            return extensionDataObject_value;
        }
        set
        {
            extensionDataObject_value = value;
        }
    }
    #endregion

    [DataMember]
    public int MyProperty { get; set; }
}

アプリケーションの新しいバージョンでは、CurrentAdditionalData クラスを認識しているため、このファイルをロードしても問題ありません。

しかし、新しいバージョンが FutureAdditionalData 型のオブジェクトを格納している場合、古いバージョンはそれを認識していないのでしょうか?

    [DataContract]
public class FutureAdditionalData : IExtensibleDataObject
{
    #region IExtensibleDataObject Members
    private ExtensionDataObject extensionDataObject_value;
    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
    public ExtensionDataObject ExtensionData
    {
        get
        {
            return extensionDataObject_value;
        }
        set
        {
            extensionDataObject_value = value;
        }
    }
    #endregion

    [DataMember]
    public string Property1 { get; set; }
    [DataMember]
    public float Property2 { get; set; }
    [DataMember]
    public double Property3 { get; set; }
}

古いバージョンがこのファイルを読み込もうとすると、この型がわからないため、SerializationException が発生します。

未知の型を認識して単純に無視するように古いバージョンを変更することは可能ですか?

または、さらに良いことに、不明なオブジェクトを ExtensionData にロードし、古いバージョンでファイルを再度保存する場合、変更せずに書き出すことは可能ですか?

4

1 に答える 1

0

Microsoft には、データ コントラクトに関するこの種の問題を解決するための完全なガイドがあります。チェックアウト: https://msdn.microsoft.com/en-us/library/ms731138.aspx

単にメンバーを追加/削除するのではなく、dataType を変更することを意味していることに気付きました。いいえ、既存のメンバーを変更するのではなく、新しいタイプの新しいメンバーを作成することで、これを適切に処理します。dataTypes の変更は、API の重大な変更です。

API に対するバージョン管理された変更を構成する変更については、次のガイダンスを確認してください

于 2015-03-01T16:47:19.037 に答える