二进制序列化


  二进制序列化一般用在使用文件存储对象的时候,这样的对象可以是应用程序的配置,或是一些重要的用户数据,经过二进制序列化 + 压缩 + 加密,是很难使用其他软件还原数据的。


1、二进制压缩

  二进制序列化时,可以采用 Deflate 压缩算法对数据进行压缩,这样可以减小对象的存储空间,或减少数据传输的大小。如下所示:

[System.Serializable]
public class BinarySerializeObject
{
    public string Name { get; set; }
 
    public DateTime Date { get; set; }
}

[TestMethod]
public void TestCompressSerializeToFile()
{
    var serializer = new BinaryCompressSerializer();
    var obj = new BinarySerializeObject { Name = "fireasy", Date = DateTime.Now };

    var bytes = serializer.Serialize(obj);

    using (var stream = new FileStream("c:\\test.dat", FileMode.Create, FileAccess.Write))
    {
        stream.Write(bytes, 0, bytes.Length);
    }
}
 
[TestMethod]
public void TestCompressDeserializeFromFile()
{
    var serializer = new BinaryCompressSerializer();

    using (var stream = new FileStream("c:\\test.dat", FileMode.Open, FileAccess.Read))
    {
        var bytes = new byte[stream.Length];
        stream.Read(bytes, 0, bytes.Length);

        var obj = serializer.Deserialize<BinarySerializeObject>(bytes);

        Assert.AreEqual("fireasy", obj.Name);
    }
}

2、二进制加密

  为了提高数据的安全性,一般需要对数据进行加密。Fireasy 在序列化的同时,可以使用指定的 ICryptoProvider 实例(可参考 密码算法)对数据进行加密。但要注意加密算法的可逆性,否则无法反序列化。如下所示:

[TestMethod]
public void TestCryptSerializeToFile()
{
    var encryptor = CryptographyFactory.Create(CryptoAlgorithm.DES);
    var serializer = new BinaryCryptoSerializer(encryptor);
    var obj = new BinarySerializeObject { Name = "fireasy", Date = DateTime.Now };

    serializer.Serialize(obj, "c:\\test.dat");
}

[TestMethod]
public void TestCryptDeserializeFromFile()
{
    var encryptor = CryptographyFactory.Create(CryptoAlgorithm.DES);
    var serializer = new BinaryCryptoSerializer(encryptor);

    var obj = serializer.Deserialize<BinarySerializeObject>("c:\\test.dat");
        
    Assert.AreEqual("fireasy", obj.Name);
}

💡 特别提醒

  要序列化的类型必须加上 SerializableAttribute 特性。