2013-02-15 78 views
4

我尝试在我的应用程序中使用DataContractSerializer以实现向后和向前兼容,并支持往返(如果可能)。Howto使用DataContractSerializer忽略未知类型

是否有可能支持往返,如果没有,是否有可能忽略未知类型在以下情况下?

假设我有一个ClassWithObject类,它具有object类型的属性,而旧版本的应用程序在此属性中存储了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,而不是简单地添加/删除成员。不,您通过为新类型创建新成员来适当地处理此问题,而不是通过更改现有的成员来处理此问题。更改dataTypes是API的重大更改。

退房什么变化构成了一个版本变化的API本指南: http://blogs.msdn.com/b/craigmcmurtry/archive/2006/07/23/676104.aspx

+0

成员的数据类型只是对象。这是因为ClassWithObject不知道该对象的类型,它只是存储该对象。该应用程序的将来版本现在将该对象设置为新类型。显然,旧版本没有[KnownType(typeof(FutureAdditionalData))]集合的属性并给出SerializationException。 – MTR 2015-03-04 13:59:54