using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace CSharpTest
{
/// <summary>
///
/// 序列化的优点
/// 以某种方式存储形式使自定义对象能持久化;
/// 能方便地 将对象传递到另外一个地方
///
/// 序列化的实质是将类的值转化为一个一般的(即连续的)字节流,然后可以将流写入到磁盘文件或任何其他可以进行流(Strean)化的目标上
/// 要想实际的写出这个流,就要使用那些实现了IFormatter 接口的类理的Serialize 和 Deserialize 方法
///
/// .NET 框架中提供了两个类,一个是BinaryFormatter类,另外一个是SoapFormatter类.
/// BinaryFormatter 类使用二进制格式进行序列化,而SoapFormatter 类使用XML 格式进行序列化.
///
/// 要使用BinaryFormater 类,只需要创建一个要使用的流的实例和一个序列化类的实例
/// 流的实例和要序列化的对象实例作为参数提供给此方法调用.类中所有的成员变量(包括标记为private 的变量)都将被序列化.
/// 注意的是能被序列化的类,必须在类的声明之前加上[Serializable()]标志
///
/// </summary>
//namespace CSharpTest
//{
// [Serializable()]
// class Class2
// {
// private string _userName = string.Empty;
// public string UserName
// {
// get
// {
// return _userName;
// }
// set
// {
// _userName = value;
// }
// }
// public string kk()
// {
// return "出来!";
// }
// }
//}
//private void button3_Click(object sender, EventArgs e)
// {
// Class2 cls=new Class2();
// cls.UserName = "我刚刚负的值";
// SerializationHelper.Serialize(cls,"f:\\1.txt");
// MessageBox.Show("成功");
// }
// private void button4_Click(object sender, EventArgs e)
// {
// Class2 cls=(Class2)SerializationHelper.Deserialize("f:\\1.txt");
// MessageBox.Show(cls.UserName.ToString());
// MessageBox.Show(cls.kk().ToString());
// }
public class SerializationHelper
{
//静态方法Serialize,将一个对象序列化为一个文件
public static void Serialize(object data, string filePath)
{ try
{
//打开文件
StreamWriter fs = new StreamWriter(filePath, false);
try
{
// 创建其支持存储区为内存的流
MemoryStream streamMemory = new MemoryStream();
// 以二进制格式将对象或整个连接对象图形序列化或反序列化
BinaryFormatter formater = new BinaryFormatter();
//将这个对象序列化到内存流中
formater.Serialize(streamMemory, data);
//先转换为字符串的形式
string binaryData = Convert.ToBase64String(streamMemory.GetBuffer());
//将数据 写入到文件
fs.Write(binaryData);
}
catch (Exception ex)
{
throw ex;
}
finally
{
fs.Flush();
fs.Close();
}
}
catch(Exception ex)
{
throw ex;
}
}
// 反序列化,从文件序列化一个对象
public static object Deserialize(string filePath)
{
object data = new object();
try
{
//打开文件
StreamReader sr = new StreamReader(filePath);
try
{
MemoryStream streamMemory;
BinaryFormatter formatter = new BinaryFormatter();
//以字符串的形式读取数据
string cipherData = sr.ReadToEnd();
byte [] binaryData=Convert.FromBase64String(cipherData);
//反序列化为对象
streamMemory = new MemoryStream(binaryData);
data = formatter.Deserialize(streamMemory);
}
catch
{
// 不能得到数据,设为空
data = null;
}
finally
{
//最后关闭文件
sr.Close();
}
}
catch
{
// 不能得到数据,设为空
data = null;
}
//返回数据
return data;
}
}
}