後方互換性と前方互換性を維持し、(可能であれば) 往復をサポートするために、アプリケーションで 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 にロードし、古いバージョンでファイルを再度保存する場合、変更せずに書き出すことは可能ですか?