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 重构一下,如果您有什么建议或者想法欢迎和我联系,多谢支持。

WeihanLi.Redis自定义序列化及压缩方式的更多相关文章

  1. SpringBoot自定义序列化的使用方式--WebMvcConfigurationSupport

    场景及需求: 项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串. 例如: [     {         "id": 1,      ...

  2. 【转】SpringBoot自定义序列化的使用方式--WebMvcConfigurationSupport

    场景及需求: 项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串. 例如:[     {         "id": 1,       ...

  3. Java 自定义序列化、反序列化

    1.如果某个成员变量是敏感信息,不希望序列化到文件/网络节点中,比如说银行密码,或者该成员变量所属的类是不可序列化的, 可以用 transient 关键字修饰此成员变量,序列化时会忽略此成员变量. c ...

  4. SpringBoot缓存管理(三) 自定义Redis缓存序列化机制

    前言 在上一篇文章中,我们完成了SpringBoot整合Redis进行数据缓存管理的工作,但缓存管理的实体类数据使用的是JDK序列化方式(如下图所示),不便于使用可视化管理工具进行查看和管理. 接下来 ...

  5. Spring整合Redis&JSON序列化&Spring/Web项目部署相关

    几种JSON框架用法和效率对比: https://blog.csdn.net/sisyphus_z/article/details/53333925 https://blog.csdn.net/wei ...

  6. fastjson自定义序列化竟然有这么多姿势?

    本文介绍下fastjson自定义序列化的各种操作. 一.什么是fastjson? fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSO ...

  7. SpringBoot缓存篇Ⅱ --- 整合Redis以及序列化机制

    一.Redis环境搭建 系统默认是使用ConcurrentMapCacheManager,然后获取和创建ConcurrentMapCache类型的缓存组件,再将数据保存在ConcurrentMap中 ...

  8. C#序列化与反序列化方式简单总结

    序列化和反序列化 相关类: System.SerializableAttribute特性(或称为属性), System.Runtime.Serialization.ISerializable(自定义序 ...

  9. .Net Core 自定义序列化格式

    序列化对大家来说应该都不陌生,特别是现在大量使用WEBAPI,JSON满天飞,序列化操作应该经常出现在我们的代码上. 而我们最常用的序列化工具应该就是Newtonsoft.Json,当然你用其它工具类 ...

随机推荐

  1. 微信小程序 bug及解决方案

    1.小程序遮罩滚动穿透问题 解决方案: <view class="mask" wx:if="{{showVipRights}}" catchtap='hi ...

  2. 由于github仓库中提前建立readme文件,导致git push报错error: failed to push some refs to 'git@github.com:

    $ git push -u origin master To git@github.com:xxx/xxx.git ! [rejected] master -> master (fetch fi ...

  3. 解决BackBox中Fcitx输入法中文输入状态下不显示候选词框的问题

    当我们安装Fcitx输入法时默认是安装了下面这个组件的: fcitx-module-kimpanel 该组件在非KDE桌面环境下可能会使Fcitx输入法在输入中文时无法显示候选词框. 使用下面的命令移 ...

  4. python函数调用的四种方式 --基础重点

    第一种:参数按顺序从第一个参数往后排#标准调用 # -*- coding: UTF-8 -*- def normal_invoke(x, y): print "--normal_invoke ...

  5. Spring Boot 定制URL匹配规则的方法

    事情的起源:有人问我,说编写了一个/hello访问路径,但是吧,不管是输入/hello还是/hello.html,还是/hello.xxx都能进行访问.当时我还以为他对代码进行处理了,后来发现不是,后 ...

  6. 使用Map标签指定点击区域时的兼容性问题

    电商m站的首页,有一个需求是配一张大的banner图,然后指定某些区域是热区,点击之后跳转到不同的活动页. 听起来简单明了,实现也比较容易,立刻就想起来有个map标签,简直就是为这个需求量身定做. 简 ...

  7. web项目部署到本地tomcat时,运行tomcat的startup.bat一闪而过

    在eclipse里面启动tomcat时都是正常的,打成War包后,也无法自动解压,百度了好多方法均尝试失败,然后看到了下方的百度经验,配完环境变量后,tomcat可以正常启动了.如下为步骤: 1. 遇 ...

  8. win 上安装cad2002的心得

    前不久,一从事测绘的哥们来找我,要我给她装一专业软件,想想应该很简单,不知为何把他难成这样,他极力要求安装xp系统,说是只有xp上才能装成功,我不信这个邪,查了许多资料发现win 7根本不兼容cad2 ...

  9. java没有firendly访问类型

    java中只有public.private.protected.default这几种修饰符,没有friendly修饰符,没加修饰符就是friendly.friendly只是一种说法,把它认为是defa ...

  10. 理解、学习与使用 Java 中的 Optional

    从 Java 8 引入的一个很有趣的特性是 Optional  类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java 程序员都 ...