Json序列化和Jdk序列化在存储上的对比?
Json序列化和Jdk序列化在存储、效率上的对比?
在之前学习Redis时,我了解的是Json序列化比原生Jdk更高效,占用空间更小,所以无脑选择Json序列化。
但是最近我在看Pig开源框架中Oauth2的时候,发现存入Token令牌居然是用的Jdk序列化方式,我很疑惑,于是自己再用Json的方式去存,看看到底会有什么区别。
结果发现Json方式占用空间比Jdk的大了很多(Jdk为17)。
我又尝试别的数据,分别用Json和jdk试试,这里Json序列化占用内存更小,为什么会出现这样的情况?
以下是测试的方法:
@SpringBootTestpublic class RedisSerializerTest {
@Autowired
RedisTemplate redisTemplate;
@Autowired
ObjectMapper objectMapper;
@BeforeEach
void initRedisTemplate() {
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(genericJackson2JsonRedisSerializer());
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer());
}
@BeforeEach
void initObjectMapper() {
objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
}
@Test
void testRedis() throws JsonProcessingException {
ComplexObject complexObject = createComplexObject();
redisTemplate.opsForValue().set("testSerailizerByJson:1",complexObject );
redisTemplate.setValueSerializer(RedisSerializer.java());
redisTemplate.opsForValue().set("testSeralizerByJdk:1", complexObject);
}
ComplexObject createComplexObject() {
ComplexObject complexObject = new ComplexObject();
complexObject.setName("Test Name");
complexObject.setAge(30);
complexObject.setHobbies(Arrays.asList("Hobby1", "Hobby2", "Hobby3"));
Map<String, String> attributes = new HashMap<>();
for (int i = 0; i < 1000; i++) {
attributes.put("Attribute" + i, "Value" + i);
}
complexObject.setAttributes(attributes);
complexObject.setLargeString("This is a large string to increase the size of the object...");
return complexObject;
}
回答:
JSON
基于字符,于是非字符的东西占用空间更多,比如数字,比如二进制,比如 bool
因为是字符所以可读,可编辑
另外是一种语言无关的格式,啥程序都能读
JDK 序列化
相比于其他二进制序列化,存了类型等等一些额外的东西,所以也没高效多少,但是因为是二进制的,所以存二进制数据相对更省空间
但是这玩意只有 Java程序可以读,而且只能程序读,直接看数据基本看不明白是啥,更不用说修改
以上是 Json序列化和Jdk序列化在存储上的对比? 的全部内容, 来源链接: utcz.com/p/945522.html