欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WeihanLi.Redis自定义序列化及压缩方式

程序员文章站 2022-03-13 18:14:48
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

自定义压缩

如果要使用自定义压缩,首先需要启用压缩,需要设置 enablecompresstrue,然后注入自己的压缩方式,自定义压缩方式需要实现 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 重构一下,如果您有什么建议或者想法欢迎和我联系,多谢支持。