在如今的微服务的项目,大家普遍采用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内存。