反序列化旧文件的问题。

3tzjq 2014-07-04 11:10:08
我有一个类:

[Serializable()]
public class KeywordOptions
{

/// <summary>
/// 关键字
/// </summary>
public string Keyword { get; set; }
/// <summary>
/// 是否为系统定义的关键字
/// </summary>
public bool Defined { get; set; }
}

然后有个泛类对象:
public StockList<KeywordOptions> MyKeywords { get; set; }
this.MyKeywords = new StockList<KeywordOptions>();
....
然后将MyKeywords 用BinaryFormatter序列化为一个文件myKeywords.dat,
现在我需要扩展KeywordOptions类(增加几个属性):

[Serializable()]
public class KeywordOptions
{

/// <summary>
/// 关键字
/// </summary>
public string Keyword { get; set; }
/// <summary>
/// 是否为系统定义的关键字
/// </summary>
public bool Defined { get; set; }
/// <summary>
/// 是否已选中做为搜索关键字配置
/// </summary>
public bool Selected { get; set; }
/// <summary>
/// 消息发布的日期是几天内的(默认 1天)
/// </summary>
public int Days { get; set; }

}


编译后我的程序要反序列化原来的myKeywords.dat文件,但这时候已经无法转换成新的KeywordOptions对像了。

System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
FileStream fs = new FileStream(@"c:\\myKeywords.dat", FileMode.Open, FileAccess.Read);
fs.Seek(0, SeekOrigin.Begin);
using (fs)
{
this.MyKeywords = (StockList<KeywordOptions>)bf.Deserialize(fs);// 这里会出错

fs.Close();
}


有没有什么解决方法?
...全文
162 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
3tzjq 2014-07-07
  • 打赏
  • 举报
回复
引用 4 楼 save4me 的回复:
参考: 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版本容错序列化
赞!原来这么简单。
3tzjq 2014-07-04
  • 打赏
  • 举报
回复
还有一种方法是添加Tag数组,然需要扩展属性时直接预定义一个Tag对象,然后写一个只读属性:public bool Selected {get{return this.Tags[0] == null ? false:(bool)this.Tags[0];}} 但这些都只是折中方法,我想有没有最好的方法。
3tzjq 2014-07-04
  • 打赏
  • 举报
回复
引用 1 楼 dongxinxi 的回复:
主要是StockList在外面包了一层,如果是单个对象应该可以 程序里面可以弄成父-子类 序列化的时候还是用父类,然后自己转成子类吧
你说的父子类我也想过,但应该也是不行的。因为程序退出时都要序列化KeywordOptionsEx到文件,如果反序列化仍然为KeywordOptions,那么新定义的属性就无法获取。 想改用XmlSerializer,最起码序列化文件是可编辑的,我大不了写一个升级组件,添加这引起新增加的属性成员(默认值)到文件,然后可以反序列化成功。
  • 打赏
  • 举报
回复
主要是StockList在外面包了一层,如果是单个对象应该可以 程序里面可以弄成父-子类 序列化的时候还是用父类,然后自己转成子类吧
save4me 2014-07-04
  • 打赏
  • 举报
回复
参考: 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版本容错序列化

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧