对象的二进制序列化非常有用,也非常方便。
我们可以把对象序列化为字节数组,也可以把对象序列化到文件,还可以把对象序列化到文件并进行加密。
先引用这些命名空间:
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;
- }
- }
- }
- }