/* 什么是序列化和反序列化
* 序列化:把对象转换为字节序列的过程称为对象的序列化
* 反序列化:把字节序列恢复为对象的过程称为对象的反序列化
*
* 什么情况下需要序列化
* 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候
* 当你想用套接字在网络上传送对象的时候
* 当你想通过RMI传输对象的时候
*
* 序列化有多重方式:二进制序列化,xml序列化,json序列化,
* 序列化的时候只序列化数据,方法是不会被序列化的
* 序列化后只是把对象的存储格式改变了,对于对象的存储对象并没有改变
* 已经序列化的数据,就可以根据相同的格式进行反序列化
*
*
* 二进制序列化就是把对象转换成二进制数据流
* 反序列化就是将二进制数据转换成对象
* 二进制序列化的时候,被序列化的对象和他的父类必须被标记为[Serializable]才可以进行二进制序列化
* 如果对象中的某个字段不想被序列化,则吧该字段标记为[NonSerialized]
* XML与JSON序列化的时候不用进行标记
*
*/
public class 序列化与反序列化
{
public static void GetXLH()
{
#region 序列化
//PersongXLH per = new PersongXLH();
//per.Age = 18;
//per.Name = "盈盈";
//per.Gender = '女';
//Console.WriteLine("JSON序列化:");
////JSON序列化,需要引入System.Web.Extensions
//JavaScriptSerializer jas = new JavaScriptSerializer();
//string str = jas.Serialize(per);
//Console.WriteLine(str);
//Console.WriteLine("XML序列化:");
////创建XML序列化器
//XmlSerializer xml = new XmlSerializer(typeof(PersongXLH));
//using (FileStream fWrite = new FileStream(@"C:\Users\Administrator\Desktop\test\练习用文件\XML序列化.xml", FileMode.OpenOrCreate, FileAccess.Write))
//{
// xml.Serialize(fWrite, per);
//}
PersongEJZ ejz = new PersongEJZ();
ejz.Age = 18;
ejz.Name = "盈盈";
ejz.Gender = '女';
Console.WriteLine("二进制序列化:");
//创建二进制序列化器
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fWrite = new FileStream(@"C:\Users\Administrator\Desktop\test\练习用文件\二进制序列化.bin", FileMode.OpenOrCreate, FileAccess.Write))
{
bf.Serialize(fWrite, ejz);
}
#endregion 序列化
#region 反序列化
//二进制在反序列话的时候必须要获取数据源对象的程序及
//这是应为在二进制序列化的时候只包含数据信息,并不包含该对象类型相关的信息,比如对象的父类,实现的接口,对象中包含的方法
//为了反序列化的时候还原这些信息,必须通过这个对象的程序及信息来获取
//创建序列化器
BinaryFormatter bff = new BinaryFormatter();
//创建一个读取流
using (FileStream fRead = new FileStream(@"C:\Users\Administrator\Desktop\test\练习用文件\二进制序列化.bin", FileMode.OpenOrCreate, FileAccess.Read))
{
//读取数据,返回结果为object类型
object obj = bff.Deserialize(fRead);
PersongEJZ fx = obj as PersongEJZ;
Console.WriteLine(fx.Name);
Console.WriteLine(fx.Age);
Console.WriteLine(fx.Gender);
}
#endregion 反序列化
}
}
/// <summary>
/// 标识出类PersongEJZ可以被序列化
/// 如果没有[Serializable]是不能被进行二进制序列化的
/// 但是可以进行XML序列化和JSON序列化
/// 如果该类为子类,则他的父类也必须标记为可序列化
/// </summary>
[Serializable]
public class PersongEJZ
{
/// <summary>
/// 使用[NonSerialized]标记该字段不能被序列化
/// </summary>
[NonSerialized]
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
/// <summary>
/// 被序列化的对象的属性也必须是可以序列化的
/// </summary>
public Car DABEN
{
get;
set;
}
/// <summary>
/// 如果是一个方法,切尔返回值类型为Car
/// 这时候就算Eat没有标记为可序列话也不会报错
/// 这是因为方法不参与序列化
/// </summary>
/// <returns></returns>
public Eat GetEat()
{
return new Eat();
}
}
/// <summary>
/// 车的类
/// </summary>
[Serializable]
public class Car
{
}
/// <summary>
/// 吃的东西的类
/// </summary>
public class Eat
{
}
/// <summary>
/// 序列化人的类
/// </summary>
public class PersongXLH
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
}