再谈 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; } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架