再谈 C# 对象二进制序列化,序列化并进行 AES 加密
对象的二进制序列化非常有用,也非常方便。
我们可以把对象序列化为字节数组,也可以把对象序列化到文件,还可以把对象序列化到文件并进行加密。
先引用这些命名空间:
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Cryptography;
using System.Text;
序列化对象到字节数组:
/// <summary> /// 把对象序列化为字节数组 /// </summary> public static byte[] SerializeObjectToBytes(object obj) { if (obj == null) return null; MemoryStream ms = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(ms, obj); byte[] bytes = ms.ToArray(); return bytes; } /// <summary> /// 把字节数组反序列化成对象 /// </summary> public static object DeserializeObjectFromBytes(byte[] bytes) { object obj = null; if (bytes == null) return obj; MemoryStream ms = new MemoryStream(bytes) { Position = 0 }; BinaryFormatter formatter = new BinaryFormatter(); obj = formatter.Deserialize(ms); ms.Close(); return obj; }
序列化对象到文件:
public static void SerializeObjectToFile(string fileName, object obj) { using (FileStream fs = new FileStream(fileName, FileMode.Create)) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs, obj); } } /// <summary> /// 把文件反序列化成对象 /// </summary> public static object DeserializeObjectFromFile(string fileName) { using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) { BinaryFormatter formatter = new BinaryFormatter(); object obj = formatter.Deserialize(fs); return obj; } }
序列化对象到文件,并进行 AES 加密:
/// <summary> /// 把对象序列化到文件(AES加密) /// </summary> /// <param name="keyString">密钥(16位)</param> public static void SerializeObjectToFile(string fileName, object obj, string keyString) { using (AesCryptoServiceProvider crypt = new AesCryptoServiceProvider()) { crypt.Key = Encoding.ASCII.GetBytes(keyString); crypt.IV = Encoding.ASCII.GetBytes(keyString); using (ICryptoTransform transform = crypt.CreateEncryptor()) { FileStream fs = new FileStream(fileName, FileMode.Create); using (CryptoStream cs = new CryptoStream(fs, transform, CryptoStreamMode.Write)) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(cs, obj); } } } } /// <summary> /// 把文件反序列化成对象(AES加密) /// </summary> /// <param name="keyString">密钥(16位)</param> public static object DeserializeObjectFromFile(string fileName, string keyString) { using (AesCryptoServiceProvider crypt = new AesCryptoServiceProvider()) { crypt.Key = Encoding.ASCII.GetBytes(keyString); crypt.IV = Encoding.ASCII.GetBytes(keyString); using (ICryptoTransform transform = crypt.CreateDecryptor()) { FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); using (CryptoStream cs = new CryptoStream(fs, transform, CryptoStreamMode.Read)) { BinaryFormatter formatter = new BinaryFormatter(); object obj = formatter.Deserialize(cs); return obj; } } } }