文章目录
前言:
在计算机一级项目中,有个微信推送的功能,这个功能涉及到序列化与反序列化,这个问题可谓是让我想了一个项目的时间,可能是因为微信推送不太了解,现在重新学习一下,总结一下
概念:
序列化
将对象(如Person对象)转换为二进制数据(字节流)
其实最终存储在了文件中,文件是一种流的源头(后备存储),文件流就是流向文件的通道(介质)
反序列化
将二进制数据还原为对象
从文件中通过二进制流,将对象还原出来
序列化与数据库存储区别
在于应用场景不同,数据库存储是为了对象持久化,将对象存储在数据库文件中。而序列化按照特定格式将对象存储在文件中,保证了对象持久化之后,更侧重于网络传输,比如json文件。
具体操作:
序列化为txt(其他后缀文件也可以)
1.要序列化的Student类
[Serializable]//标识为可序列化
class Student
{
private string name;
public string Name {
get { return name; }
set { name = value; }
}
private int age;
public int Age {
get { return age; }
set { age = value; }
}
}
2.引入命名空间
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
3.序列化代码
序列化student对象到student.txt文件中
static void Main(string[] args)
{
Student s = new Student() { Name = "zxg", Age = 18 };
//创建流
using (FileStream fs =File.Create("student.txt"))
{
BinaryFormatter bf = new BinaryFormatter();
//序列化student对象
bf.Serialize(fs, s);
}
Console.Read();
}
4.验证结果
在该程序的Debug中创建一个student.txt文件
5.反序列化
将student对象从student.txt文件中还原出来
static void Main(string[] args)
{
//文件流打开文件
using (FileStream fs = File.OpenRead("student.txt"))
{
BinaryFormatter bf = new BinaryFormatter();
//反序列化对象
Student stu = (Student)bf.Deserialize(fs);
//输出对象名字
Console.WriteLine(stu.Name);
}
Console.Read();
}
6.显示结果:
序列化为json文件
1.要序列化的Student类
这次加入了一个Show方法,在反序列化为对象时调用,验证反序列化成功
[DataContract]//要标识
public class Student
{
[DataMember(Name ="Name")]//要标识
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
[DataMember(Name ="Age")]//要标识
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
public void Show()
{
Console.WriteLine("我的名字是{0}",Name);
}
}
2.引入命名空间
在Student类中引入
using System.Runtime.Serialization;
在序列化类(自定义一个类,下面会有)中引入
using System.Runtime.Serialization.Json;
using System.IO;
3.定义一个序列化类
- WriteObject方法将对象转换成json
- ReadObject方法将json转换成对象
public class EndSerialize
{
//序列化
public string Serializel(Student stu)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Student));
MemoryStream ms = new MemoryStream();
//WriteObject方法将对象转换成json
ser.WriteObject(ms, stu);
string jsonStr = Encoding.UTF8.GetString(ms.ToArray());
return jsonStr;
}
//反序列化
public Student Deserialize(string jsonStr)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Student));
byte[] byteData = UTF8Encoding.UTF8.GetBytes(jsonStr);
MemoryStream ms1 = new MemoryStream(byteData);
//ReadObject方法将json转换成对象
Student stu = (Student)ser.ReadObject(ms1);
return stu;
}
}
4.外部调用
static void Main(string[] args)
{
Student s = new Student() { Name = "zxg", Age = 18 };
EndSerialize ser = new EndSerialize();
//序列化Student对象为json字符串
string stuStr= ser.Serializel(s);
Console.WriteLine(stuStr);
//从json字符串中提取对象
Student s1= ser.Deserialize(stuStr);
//对象调用自身方法
s1.Show();
Console.Read();
}
5.验证结果:
总结:
序列化与文件流相关,序列化对象后通过流存储到文件中
反序列化打开文件形成流,还原成对象