先解释下概念:
序列化就是把一个对象保存到一个文件或数据库字段中去,方便我们的存储与信息交换。反序列化就是在适当的时候把这个文件再转化成原来的对象使用。也可以说,序列化的目的就是为了跨进程传递格式化数据。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。
简单来说:
把对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为对象的过程称为对象的反序列化。
放代码:
二进制序列化
namespace 序列化
{
public class Program
{
static void Main(string[] args)
{
List<Person> list=new List< Person>();
list.Add(new Person() { Name = "1", Age = 19 });
list.Add(new Person() { Name = "2", Age = 29});
list.Add(new Person() { Name = "3", Age = 16 });
#region 二进制序列化
BinaryFormatter bf=new BinaryFormatter();
using(FileStream fsWrite=File.OpenWrite("1.bin"))
{
bf.Serialize(fsWrite,list);//序列化
//bf.Deserialize();//反序列化
Console.WriteLine("ok");
Console.ReadKey();
}
#endregion
}
#region Person类
public class Person
{
//三个属性
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
//两个方法
public void SayHi()
{
Console.WriteLine("我是:{0}", Name);
}
public void SayHello()
{
Console.WriteLine("Hello");
}
}
#endregion
}
}
二进制序列化要求:
1.被序列化的对象的类型必须标记为可序列化的。
2.二进制序列化会把属性对应的字段序列化到文件中,类型中最好不要使用自动属性(编译器会自动生成字段),而要自己写属性与字段
3.当序列化一个对象的时候,这个对象本身以及的所有父类都必须标记为可序列化的。
4.类型中所有属性与字段的类型必须也标记为可序列化的。接口不需要。
5.通过[NonSerialized]把某个字段标记为不可序列化的。
JavaScript序列化
#region 使用JavaScript序列化
//使用JavaScript序列化
JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
string str = jsSerializer.Serialize(list);
//jsSerializer.Deserialize();//反序列化
File.WriteAllText("list.txt", str);
Console.WriteLine(str);
Console.ReadKey();
使用XML序列化
//使用XML序列化
XmlSerializer xmlSerializer = new XmlSerializer(list.GetType());//拿到type
using(FileStream fsWrite=File.OpenWrite("1.xml"))
{
xmlSerializer.Serialize(fsWrite,list);
//xmlSerializer.Deserialize();//反序列化
}
Console.WriteLine("ok");
Console.ReadKey();
#endregion
说点什么
欢迎讨论