WeihanLi.Redis自定義序列化及壓縮方式 Intro "WeihanLi.Redis" 是基於 "StackExchange.Redis" 的擴展,提供了一些常用的業務組件和對泛型的更好支持,預設使用 JSON.Net 為基礎的 JSON序列化,使用 GZip 進行數據壓縮。 從 1.3. ...
WeihanLi.Redis自定義序列化及壓縮方式
Intro
WeihanLi.Redis 是基於 StackExchange.Redis 的擴展,提供了一些常用的業務組件和對泛型的更好支持,預設使用 JSON.Net 為基礎的 JSON序列化,使用 GZip 進行數據壓縮。
從 1.3.0 版本開始支持自定義序列化和壓縮方式,下麵介紹一下如何實現自定義序列化以及壓縮。基本用法可以查看項目說明或這篇介紹
自定義序列化
自定義序列化只需要實現自己的 IDataSerializer
就可以了,用自己的序列化實現 IDataSerializer
介面,並註入服務即可(註:序列化器一個生命周期應當是 Singleton
)。
Binary序列化的 BinaryDataSerializer 示例代碼:
public class BinaryDataSerializer : IDataSerializer
{
private readonly BinaryFormatter _binaryFormatter = new BinaryFormatter();
public T Deserializer<T>(byte[] bytes)
{
using (var memoryStream = new MemoryStream(bytes))
{
return (T)_binaryFormatter.Deserialize(memoryStream);
}
}
public byte[] Serialize<T>(T obj)
{
using (var memoryStream = new MemoryStream())
{
_binaryFormatter.Serialize(memoryStream, obj);
return memoryStream.ToArray();
}
}
}
IServiceCollection services = new ServiceCollection();
services.AddRedisConfig(options => { });
// custom serializer
services.AddSingleton<IDataSerializer, BinaryDataSerializer>();
// set resolver
DependencyResolver.SetDependencyResolver(services);
WeihanLi.Common 中實現了三個序列化器,BinaryDataSerializer/XmlDataSerializer/JsonDataSerializer,可以參考 https://github.com/WeihanLi/WeihanLi.Common/blob/dev/src/WeihanLi.Common/Helpers/IDataSerializer.cs
自定義壓縮
如果要使用自定義壓縮,首先需要啟用壓縮,需要設置 EnableCompress
為 true
,然後註入自己的壓縮方式,自定義壓縮方式需要實現 IDataCompressor
介面,目前用到的只是同步方法,非同步方法可以暫時不實現。
IServiceCollection services = new ServiceCollection();
services.AddRedisConfig(options => { options.EnableCompress = true; });
// custom compressor
services.AddSingleton<IDataCompressor, MockDataCompressor>();
// set resolver
DependencyResolver.SetDependencyResolver(services);
MockDataCompressor 什麼都沒做,只是把數據原樣返回了,並沒有做處理,示例代碼:
publicclass MockDataCompressor : IDataCompressor
{
public byte[] Compress(byte[] sourceData)
{
return sourceData;
}
public Task<byte[]> CompressAsync(byte[] sourceData)
{
return Task.FromResult(sourceData);
}
public byte[] Decompress(byte[] compressedData)
{
return compressedData;
}
public Task<byte[]> DecompressAsync(byte[] compressedData)
{
return Task.FromResult(compressedData);
}
}
Sample
這裡提供一個示例項目,可以參考。
自定義序列化和壓縮方式示例代碼:
public static void Main(string[] args)
{
IServiceCollection services = new ServiceCollection();
services.AddRedisConfig(options => { options.EnableCompress = true; });
services.AddSingleton<IDataSerializer, BinaryDataSerializer>();
services.AddSingleton<IDataCompressor, MockDataCompressor>();
DependencyResolver.SetDependencyResolver(services);
Console.ReadLine();
}
End
如果在使用過程中有遇到什麼問題,歡迎與我聯繫,最近想大調整,為 .netstandard 重構一下,如果您有什麼建議或者想法歡迎和我聯繫,多謝支持。