一.序列化概念
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
二.序列化方式
1.XML序列化
-定义对象类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SerializbleDemo
{
using System.Xml;
using System.Xml.Serialization;
[XmlRoot]
public class Student
{
[XmlElement(Order =0)]
public int ID { get; set; }
[XmlElement(Order =1)]
public string StuName { get; set; }
[XmlElement(Order =2)]
public int Age { get; set; }
}
}
- 序列化实现
/// <summary>
/// 基于xml序列化
/// </summary>
void ShowXmlSerializable()
{
var xmlSerilizableObj = new Student()
{
ID = 100,
StuName = "张三",
Age = 20
};
//开辟内存
var ms = new MemoryStream();
//序列化对象
var serializa = new XmlSerializer(typeof(Student));
serializa.Serialize(ms, xmlSerilizableObj);
ms.Position = 0;
var s = new StreamReader(ms);
var stu = s.ReadToEnd();
this.richTextBox1.Text = stu;
}
2.Soap序列化
- 对象定义
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SerializbleDemo
{
[Serializable]
public class StuSoap
{
public int ID { get; set; }
public string StuName { get; set; }
public int Age { get; set; }
}
}
- 序列化实现
/// <summary>
/// 基于soap序列化
/// </summary>
void ShowSoapSerializable()
{
var stuSoap = new StuSoap()
{
ID = 100,
StuName = "张三",
Age = 20
};
//格式化器
var formatter = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();
//开辟内存
var ms = new MemoryStream();
formatter.Serialize(ms, stuSoap);
ms.Position = 0;
var str = Encoding.UTF8.GetString(ms.GetBuffer());
richTextBox1.Text = str;
}
3.Binary序列化
-序列化对象类
using System;
namespace SerializbleDemo
{
[Serializable]
public class StuBinary
{
public int ID { get; set; }
public string StuName { get; set; }
public int Age { get; set; }
}
}
- 序列化实现
/// <summary>
/// 基于二进制序列化
/// </summary>
void BinarySerializable()
{
StuBinary stu = new StuBinary()
{
ID = 1001,
StuName = "王五",
Age = 23
};
//定义一个格式化器
var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
//开辟内存
var ms = new MemoryStream();
//序列化到流
formatter.Serialize(ms, stu);
ms.Position = 0;
byte[] buffer = ms.GetBuffer();
//转换为二进制值
var str = System.Text.Encoding.UTF8.GetString(buffer);
//....
}
4.基于契约序列化 DataContract
- 对象类
using System.Runtime.Serialization;
namespace SerializbleDemo
{
[DataContract]//添加特性
public class StuDataContract
{
[DataMember(Order =0)]
public int ID { get; set; }
[DataMember(Order =1)]
public string StuName { get; set; }
[DataMember(Order = 2)]
public int Age { get; set; }
}
}
- 序列化实现
/// <summary>
/// 序列化DataContract格式
/// </summary>
private void DataContractSerializable()
{
StuDataContract stu = new StuDataContract()
{
ID = 1001,
StuName = "小明",
Age = 23
};
//定义转换器
var ser = new System.Runtime.Serialization.DataContractSerializer(typeof(StuDataContract));
//内存器
var ms = new MemoryStream();
ser.WriteObject(ms, stu);
ms.Position = 0;
var reader = new StreamReader(ms);
var s = reader.ReadToEnd();
richTextBox1.Text = s;
/*
<StuDataContract xmlns="http://schemas.datacontract.org/2004/07/SerializbleDemo" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><ID>1001</ID><StuName>小明</StuName><Age>23</Age></StuDataContract>
*/
}
5.基于契约序列化 DataContractJson
- 对象类
using System.Runtime.Serialization;
namespace SerializbleDemo
{
[DataContract]//添加特性
public class StuDataContractJson
{
[DataMember(Order =0)]
public int ID { get; set; }
[DataMember(Order =1)]
public string StuName { get; set; }
[DataMember(Order = 2)]
public int Age { get; set; }
}
}
- 序列化实现
/// <summary>
/// 序列化 StuDataContractJson
/// </summary>
private void StuDataContractJsonSerializable()
{
var stu = new StuDataContractJson()
{
ID = 1001,
StuName = "小红",
Age = 26
};
var ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(StuDataContractJson));
//内存器
var ms = new MemoryStream();
ser.WriteObject(ms, stu);
ms.Position = 0;
var reader = new StreamReader(ms);
var s = reader.ReadToEnd();
// {"ID":1001,"StuName":"小红","Age":26}
richTextBox1.Text = s;
}