问题:
你有一个诸如ArrayList、List<T>、Hashtable或者Dictionary<T,U>这样的集合,在其中存储应用程序信息。可以使用该信息将应用程序的环境定制成最后一只的设置(例如,窗口大小,窗口位置和当前显示的工具栏)。也可以用它来允许用户在上一次关闭应用程序的相同位置启动应用程序。换句话说,如果用户正在编辑发票并且需要在晚上关闭计算机,当下次启动应用程序时,它将准确的知道初始化要显示哪张发票。
解决方案:
在对象与文件之间进行序列化/反序列化。
public static void SerializeToFile<T>(T obj, string dataFile)
{
using (FileStream fileStream = File.Create(dataFile))
{
BinaryFormatter binSerializer = new BinaryFormatter();
binSerializer.Serialize(fileStream, obj);
}
}
public static T DeserializeFromFile<T>(string dataFile)
{
T obj = default(T);
using (FileStream fileStream = File.OpenRead(dataFile))
{
BinaryFormatter binSerializer = new BinaryFormatter();
obj = (T)binSerializer.Deserialize(fileStream);
}
return obj;
}
讨论:
dataFile参数接受一个字符串值作为文件名。SerializeToFile<T>方法接受一个对象并尝试将其序列化到一个文件。相反,DeserializeFromFile<T>方法从SaveObj<T>方法创建的文件中获取序列化的对象。
例2-3展示了如何使用这些方法序列化一个ArrayList对象(注意,这适用于标记有SerializableAttribute的任何类型)。
例2-3:在应用程序会话间持久化一个集合:
ArrayList HT = new ArrayList() { "Zero", "One", "Two" };
foreach (object O in HT)
Console.WriteLine(O.ToString());
SerializeToFile<ArrayList>(HT, "HT.data");
ArrayList HTNew = new ArrayList();
HTNew = DeserializeFromFile<ArrayList>("HT.data");
foreach (object O in HTNew)
Console.WriteLine(O.ToString());
如果在应用程序中的特定时刻把对象序列化到磁盘,以后就可以反序列化他们并恢复到一种已知的状态,例如意外关机时。
你也可以在对象与字节流间进行序列化/反序列化以存储到独立存储或远程存储。
public static byte[] Serialize<T>(T obj)
{
using (MemoryStream memStream = new MemoryStream())
{
BinaryFormatter binSerializer = new BinaryFormatter();
binSerializer.Serialize(memStream, obj);
return memStream.ToArray();
}
}
public static T Deserialize<T>(byte[] serializedObj)
{
T obj = default(T);
using (MemoryStream memStream = new MemoryStream(serializedObj))
{
BinaryFormatter binSerializer = new BinaryFormatter();
obj = (T)binSerializer.Deserialize(memStream);
}
return obj;
}
(注:如果你依靠序列化的对象来存储持久信息,就需要清楚在部署应用程序的新版本时将要做什么。应用预先计划一种策略,确保序列化的类型不会发生变化;或者预先计划一种技术,用于处理发生的变化。否则,在部署更新版本时将会遇到严重的问题。查阅MSDN中的文章“版本容错序列化”以了解处理这一情况的理念和最佳实践。
参考:
MSDN文档中的“ArrayList类”“Hashtable类”“List<T>类”“Dictionary<T,U>类”“File类”“版本容错序列化”和“BinaryFormatter类”主题。