Я пытаюсь использовать DataContractSerializer в своем приложении, чтобы быть совместимым с обратным и прямым доступом и поддерживать двустороннее путешествие (если возможно).Howto игнорировать неизвестные типы с DataContractSerializer
Возможно ли поддерживать двустороннюю поездку, а если нет, можно ли просто игнорировать неизвестные типы в следующем сценарии?
Предположим, что у меня есть класс 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 и записать его без изменений, если старая версия сохраняет файл снова?
Тип данных элемента просто объект. Это связано с тем, что ClassWithObject не знает, к какому типу принадлежит объект, он просто сохраняет объект. Будущая версия приложения теперь устанавливает объект в новый тип. Очевидно, что старая версия не имеет атрибута [KnownType (typeof (FutureAdditionalData))] и предоставляет исключение SerializationException. – MTR