2013-02-15 6 views
4

Я пытаюсь использовать 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 и записать его без изменений, если старая версия сохраняет файл снова?

ответ

0

Корпорация Майкрософт имеет полное руководство для решения этих проблем с использованием Контрактов данных. Отъезд: https://msdn.microsoft.com/en-us/library/ms731138.aspx

Я только понял, что вы имели в виду, что вы меняете dataType, а не просто добавляете/удаляете элемент. Нет, вы справляетесь с этим соответствующим образом, создавая новый член для нового типа, а не изменяя существующий. Изменение типов данных - это нарушение для API.

Заканчивать это руководство о том, какие изменения являются версированная изменения в API: http://blogs.msdn.com/b/craigmcmurtry/archive/2006/07/23/676104.aspx

+0

Тип данных элемента просто объект. Это связано с тем, что ClassWithObject не знает, к какому типу принадлежит объект, он просто сохраняет объект. Будущая версия приложения теперь устанавливает объект в новый тип. Очевидно, что старая версия не имеет атрибута [KnownType (typeof (FutureAdditionalData))] и предоставляет исключение SerializationException. – MTR