- 定义
- 作用
- 序列化步骤
- 反序列化
- 下面我们来学习序列化为xml格式文件
- 第三种protobuf序列化与反序列化
- 定义:Protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。除了比Json、XML有速度上的优势和使用上的方便外,protocolbuf还可以做到向前兼容和向后兼容。
- 步骤
序列化:就是将对象转换为二进制
反序列化:二进制转换为对象
作用:传输数据
序列化步骤- 在类前加上[Serializable],指示一个类可以序列化。
- 创建序列化对象 BinaryFormatter
- 调用Serialize 序列化
如下面例子,生成一个二进制文件
public class Person
{
private string _name;
private char _gender;
private int _age;
public string Name { get => _name; set => _name = value; }
public char Gender { get => _gender; set => _gender = value; }
public int Age { get => _age; set => _age = value; }
}
调用
static void Main(string[] args)
{
Person p = new Person();
p.Name = "张三";
p.Age = 18;
p.Gender = '男';
using (FileStream fsWrite = new FileStream(@"C:UsershpDesktop1.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
//序列化对象
BinaryFormatter f = new BinaryFormatter();
f.Serialize(fsWrite, p);
}
}
反序列化
- 在类前加上[Serializable],指示一个类可以序列化。
- 创建序列化对象 BinaryFormatter
- 调用Deserialize 序列化
Person p;
using (FileStream fsRead = new FileStream(@"C:UsershpDesktop1.txt",FileMode.OpenOrCreate,FileAccess.Read))
{
//创建反序列化对象
BinaryFormatter bf = new BinaryFormatter();
p = (Person)bf.Deserialize(fsRead);
}
Console.WriteLine(p.Name);
Console.WriteLine(p.Gender);
Console.WriteLine(p.Age);
Console.ReadKey();
打印效果
- 创建xml序列化对象 XmlSerializer
- 调用 Serialize 反序列化 Deserialize
public struct pca
{
public string ID;
public string SN;
public string X;
public string Y;
public string Angle;
}
private void button3_Click(object sender, EventArgs e)
{
pca p = new pca();
p.ID = textBox1.Text;
p.SN = textBox2.Text;
p.X = textBox3.Text;
p.Y = textBox4.Text;
p.Angle = textBox5.Text;
string path = @"C:UsershpDesktop5.xml";
//创建 xml序列化对象
using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
{
XmlSerializer xs = new XmlSerializer(typeof(pca));
xs.Serialize(fs, p);
}
MessageBox.Show("保存成功");
}
private void button2_Click(object sender, EventArgs e)
{
//反序列化
string path = @"C:UsershpDesktop5.xml";
XmlSerializer xs = new XmlSerializer(typeof(pca));
pca p;
using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
p=(pca) xs.Deserialize(fs);
}
textBox1.Text = p.ID ;
textBox2.Text= p.SN ;
textBox3.Text= p.X ;
textBox4.Text= p.Y ;
textBox5.Text= p.Angle;
}
第三种protobuf序列化与反序列化
定义:Protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。除了比Json、XML有速度上的优势和使用上的方便外,protocolbuf还可以做到向前兼容和向后兼容。
步骤
- 添加protobuf-net.dll,System.Memory.dll,protobuf-net.Core.dll引用文件到项目中dll文件下载
- 引用 using protobuf;
- 将类用[protoContract]标记为可以用protobuf工具可序列化
- 在字段或属性//添加特性,表示该属性可以被序列化,1可以理解为下标(基本成员)
- 调用Serializer.Serialize<类型>(fsWrite, p);序列化
//序列化对象
Person p = new Person();
p.Name = "张三";
p.Age = 19;
p.Gender = '男';
using (FileStream fsWrite = new FileStream(@"C:UsershpDesktop6.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
//序列化对象
Serializer.Serialize(fsWrite, p);
}
Console.WriteLine("序列化成功");
Console.ReadKey();
//反序列化
Person p1;
using (var fs = new FileStream(@"C:UsershpDesktop6.txt", FileMode.Open, FileAccess.Read))
{
p1 = Serializer.Deserialize(fs);
}
Console.WriteLine("反序列化成功");
Console.WriteLine(p1.Age + p1.Name + p1.Gender);
Console.ReadKey();



