07. SDR 自定义序列化-fastjson

对于json 解析, 除了jackson之外, fastjson 也是一种常用的解析方式。虽然SDR 并为直接提供Fastjson 的序列化方式, 但是fastjson 却提供了两个RedisSerializer 的实现类, 我们可以直接整合使用.

1. FastJson 提供的RedisSerializer 实现类

fastjson 为RedisSerializer 接口提供了两个实现类GenericFastJsonRedisSerializer 和 FastJsonRedisSerializer, 位于包com.alibaba.fastjson.support.spring 下.

  • GenericFastJsonRedisSerializer: 不支持设置FastJsonConfig 特性, 生成json串会多一个type参数, type的值为class 名称
  • FastJsonRedisSerializer: 支持设置FastJsonCofing 特性, 默认生成json串不包含type属性

1.1 GenericFastJsonRedisSerializer

public class GenericFastJsonRedisSerializer implements RedisSerializer<Object> {
    private final static ParserConfig defaultRedisConfig = new ParserConfig();
    static { defaultRedisConfig.setAutoTypeSupport(true);}

    public byte[] serialize(Object object) throws SerializationException {
        if (object == null) {
            return new byte[0];
        }
        try {
            return JSON.toJSONBytes(object, SerializerFeature.WriteClassName);
        } catch (Exception ex) {
            throw new SerializationException("Could not serialize: " + ex.getMessage(), ex);
        }
    }

    public Object deserialize(byte[] bytes) throws SerializationException {
        if (bytes == null || bytes.length == 0) {
            return null;
        }
        try {
            return JSON.parseObject(new String(bytes, IOUtils.UTF8), Object.class, defaultRedisConfig);
        } catch (Exception ex) {
            throw new SerializationException("Could not deserialize: " + ex.getMessage(), ex);
        }
    }
}

1.2 FastJsonRedisSerializer

public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
    private FastJsonConfig fastJsonConfig = new FastJsonConfig();
    private Class<T> type;

    public FastJsonRedisSerializer(Class<T> type) {
        this.type = type;
    }

    public FastJsonConfig getFastJsonConfig() {
        return this.fastJsonConfig;
    }

    public void setFastJsonConfig(FastJsonConfig fastJsonConfig) {
        this.fastJsonConfig = fastJsonConfig;
    }

    public byte[] serialize(T t) throws SerializationException {
        if (t == null) {
            return new byte[0];
        } else {
            try {
                return JSON.toJSONBytes(t, this.fastJsonConfig.getSerializeConfig(), this.fastJsonConfig.getSerializerFeatures());
            } catch (Exception var3) {
                throw new SerializationException("Could not serialize: " + var3.getMessage(), var3);
            }
        }
    }

    public T deserialize(byte[] bytes) throws SerializationException {
        if (bytes != null && bytes.length != 0) {
            try {
                return JSON.parseObject(bytes, this.type, this.fastJsonConfig.getFeatures());
            } catch (Exception var3) {
                throw new SerializationException("Could not deserialize: " + var3.getMessage(), var3);
            }
        } else {
            return null;
        }
    }
}

2. 集成fastjson 序列化方式

2.1 引入依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.54</version>
</dependency>

2.2 配置自定义RedisTemplate

  • 笔者对key设置String 序列化方式, 对value 设置为fastjson 序列化方式
  • 笔者使用GenericJackson2JsonRedisSerializer 序列化方式
@Bean("fastJsonRedisTemplate")
public RedisTemplate<String, Object> fastJsonRedisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {
    RedisTemplate<String,Object> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);
    template.setKeySerializer(new StringRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new GenericFastJsonRedisSerializer());
    template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    return template;
}

2.3 测试用例

public class Test_fastJsonRedisTemplate {

    @Autowired
    private RedisTemplate fastJsonRedisTemplate;

    @Test
    public void test_set() {
        ValueOperations ops = fastJsonRedisTemplate.opsForValue();

        UserPO userPO = new UserPO("zhangsan", "123456", 20);

        ops.set("zhangsan", userPO);
    }

    @Test
    public void test_get(){
        ValueOperations ops = fastJsonRedisTemplate.opsForValue();

        UserPO userPO = (UserPO) ops.get("zhangsan");

        System.out.println(userPO);

    }
}

2.4 Redis 内存储

通过命令行查看redis存储

127.0.0.1:6379> get zhangsan
"{\"@type\":\"org.zongf.learn.sdr.l01.UserPO\",\"age\":20,\"password\":\"123456\",\"username\":\"zhangsan\"}"

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
plutosdr-m2k-usb-drivers.exe - v0.9是一个PlutoSDR设备的USB驱动程序,是版本为0.9的软件。PlutoSDR是由ADI公司(Analog Devices Inc.)开发的一款开源软件定义无线电(SDR)开发板。这个USB驱动程序主要用于让计算机识别和与PlutoSDR设备进行通信。 v0.9版本的plutosdr-m2k-usb-drivers.exe是PlutoSDR设备的驱动程序的一个较早的版本。这个版本的驱动程序可能具有一些限制或不足,而后续的版本可能会修复和改进这些问题。建议用户在使用PlutoSDR设备时,尽可能使用最新版本的驱动程序,以获得更好的性能和功能支持。 要安装plutosdr-m2k-usb-drivers.exe - v0.9,用户可以按照以下步骤进行操作: 1. 下载plutosdr-m2k-usb-drivers.exe - v0.9文件到计算机上。 2. 双击运行该文件,开始驱动程序的安装。 3. 按照安装程序的指示进行操作,完成驱动程序的安装过程。 4. 安装完成后,将PlutoSDR设备通过USB连接到计算机上。 5. 计算机会自动检测和识别PlutoSDR设备,完成与设备的连接。 完成以上步骤后,用户即可通过计算机与PlutoSDR设备进行通信,使用PlutoSDR设备进行软件无线电开发和实验。用户还可以根据需要升级驱动程序到最新版本,以获得更好的性能和功能支持。 值得注意的是,驱动程序的安装和操作前应确保计算机符合系统要求,并遵循安全操作的原则,避免操作失误引发问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值