WeihanLi.Redis自定义序列化及压缩方式
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 重构一下,如果您有什么建议或者想法欢迎和我联系,多谢支持。