知识需要不断积累、总结和沉淀,思考和写作是成长的催化剂
这篇很轻松,没有什么费脑子的,所以解析较少,代码较多,为数不多的拿来即用篇
整个章节分布请移步 .NET开篇总括
文章目录
一、概述
序列化是把一个内存中的对象
的信息转化成一个可以持久化保存(二进制数据)
的形式,以便于保存或传输,序列化的主要作用是不同平台之间进行通信,常用的有序列化有json、xml、文件等,反序列化是将进制数据还原为对象
,内存中的对象稍纵即逝,序列化反序列化就是为了保持对象的持久化。就像用DV录像,用播放器播放一样。
加密是通过对消息进行编码
,建立一种安全的交流方式
,使得只有你和你所期望的接收者能够理解。
二、序列化
1、二进制文件
内置的BinaryFormatter
二进制序列化器用于将对象序列化和反序列化二进制文件。要引用System.Runtime.Serialization.Formatters.Binary。
假设我们有以下对象
[Serializable] //必须添加序列化特性
public class Person
{
[NonSerialized]
public int Id = 1;
public string Name {
get; set; }
public string Sex {
get; set; }
}
创建一个BinaryFormatter实例,调用实例Serialize方法将对象写入文件流中
string fileName = Path.Combine("D:\\", @"BinarySerialize.txt");//文件名称与路径
using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
{
Person p = new Person() {
Id = 1, Name = "jack", Sex = "男" };//对象
BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
binFormat.Serialize(fStream, p);
}
通过调用实例Deserialize方法把二进制文本反序列化为对象
using (Stream fStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
{
BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
fStream.Position = 0;//重置流位置
Person p = (Person)binFormat.Deserialize(fStream);//反序列化对象
}
但注意我们必须在类上面标记Serializable特性
,才能序列化该对象,默认属性字段都可序列化了,当然我们通过标记NonSerialized
可以要求某个字段不序列化,但这样反序列后该字段就会没有值(或默认值)
结合咱们前天学到的泛型,我们包装一下BinarySerializeHelper帮助类
public class BinarySerializeHelper
{
/// <summary>
/// 将对象序列化为字符串
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="t">实例</param>
/// <returns>字符串</returns>
public static string ObjectToString<T>(T t)
{
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, t);
string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
return result;
}
}
/// <summary>
/// 将对象序列化为文件
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="t">实例</param>
/// <param name="path">存放路径</param>
public static void ObjectToFile<T>(T t, string path)
{
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
{
formatter.Serialize(stream, t);
stream.Flush();
}
}
/// <summary>
/// 将字符串反序列为类型
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="s">字符串</param>
/// <returns>对象</returns>
public static T StringToObject<T>(string s) where T : class
{
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(s);
BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream(buffer))
{
T result = formatter.Deserialize(stream) as T;
return result;
}
}
/// <summary>
/// 将文件反序列化为对象
/// </summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="path">路径</param>
/// <returns>对象</returns>
public static T FileToObject<T>(string path)