解决方案 »

  1.   

    主要是StockList在外面包了一层,如果是单个对象应该可以
    程序里面可以弄成父-子类
    序列化的时候还是用父类,然后自己转成子类吧
      

  2.   


    你说的父子类我也想过,但应该也是不行的。因为程序退出时都要序列化KeywordOptionsEx到文件,如果反序列化仍然为KeywordOptions,那么新定义的属性就无法获取。想改用XmlSerializer,最起码序列化文件是可编辑的,我大不了写一个升级组件,添加这引起新增加的属性成员(默认值)到文件,然后可以反序列化成功。
      

  3.   

    还有一种方法是添加Tag数组,然需要扩展属性时直接预定义一个Tag对象,然后写一个只读属性:public bool Selected {get{return this.Tags[0] == null ? false:(bool)this.Tags[0];}}但这些都只是折中方法,我想有没有最好的方法。
      

  4.   

    参考: Deserializing a newer version of an object from an older version of the object
    How do I deserialize old data for a type that has changed?
    在新添加的属性里面加上[OptionalField(VersionAdded = 2)]这种属性标签,然后在[OnDeserialized()]标签的方法中,赋予默认值或者清除错误
    关于OptionalFieds,参考MSDN版本容错序列化