java 对象序列化操作-- 只序列化非空字段

在如今的微服务的项目,大家普遍采用redis作为分布是缓存。往redis中存储一个对象,如果有该对象有很多属性,但是其中又有大量的属性为null。此时我们就想要对为null的字段不进行序列化。为了达到这个目标,我们只需要进行如下配置就可以实现:

    public static void main(String[] args) {

        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
         //1、该句用来设置只序列化非空的字段
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);


        User user = new User();
        user.setDepartName("张三");
        user.setNickName("");
        byte[] serialize = jackson2JsonRedisSerializer.serialize(user);
        System.out.println(serialize.length);
        

        System.out.println(new String(serialize));
    }

运行查看输出的结果:

163
["com.lolaage.model.user.User",{"nickName":"","departPoliceFlag":0,"departName":"张三","admin":0,"roleTypeText":"","isActive":false,"lose":false,"active":false}]

如果将注释objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);再次运行,查看结果为:

1657
["com.lolaage.model.user.User",{"id":null,"userName":null,"typeList":null,"imsi":null,"serialNumber":null,"policeNumber":null,"frameNumber":null,"licencePlate":null,"useMobileUser":null,"nickName":"","password":null,"encryptedPd":null,"originalDepartId":null,"departPoliceFlag":0,"departId":null,"parentsName":null,"sparentDepartName":null,"aggregate":null,"aggregateArea":null,"departName":"张三","position":null,"provinceId":null,"province":null,"cityId":null,"city":null,"telephone":null,"mobilephone":null,"email":null,"picture":null,"createdAt":null,"updatedAt":null,"lat":null,"lng":null,"longtitude":null,"latitude":null,"icon":null,"roughtState":null,"roleId":null,"roleText":null,"isLocator":null,"terminalType":null,"terminalTypeList":null,"admin":0,"onLine":null,"treeId":null,"companyId":null,"portrail":null,"groupId":null,"groupName":null,"groupType":null,"userGroups":null,"defaultGroupName":null,"presetGroupName":null,"temporaryGroupName":null,"userAllGroups":null,"currentGroupName":null,"bindId":null,"bebindId":null,"bindUser":null,"bindNickName":null,"online":null,"terminalVersion":null,"systemVersion":null,"localVideoDefinition":null,"forbidLocation":null,"deviceStatus":null,"yesterdayDistances":null,"currentMonthDistances":null,"historyDistances":null,"departIds":null,"departIdList":null,"gender":null,"roleType":null,"roleTypeText":"","roleLabelName":null,"deviceType":null,"parentDepName":null,"bebindRoleType":null,"bebindRoleTypeText":null,"bebindRoleLabelName":null,"isActive":false,"isEnable":null,"lose":false,"openId":null,"unionId":null,"deviceIds":null,"userIds":null,"sessionId":null,"roleName":null,"active":false}]

可以看到两次序列化对象后结果的大小相差10倍以上,如果我们启用这个配置,将会节省很多redis内存。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值