当前位置: 首页 > 知识库问答 >
问题:

java - Json序列化和Jdk序列化在存储上的对比?

澹台蕴藉
2024-01-24

Json序列化和Jdk序列化在存储、效率上的对比?
在之前学习Redis时,我了解的是Json序列化比原生Jdk更高效,占用空间更小,所以无脑选择Json序列化。

但是最近我在看Pig开源框架中Oauth2的时候,发现存入Token令牌居然是用的Jdk序列化方式,我很疑惑,于是自己再用Json的方式去存,看看到底会有什么区别。
结果发现Json方式占用空间比Jdk的大了很多(Jdk为17)。
image.png
image.png

我又尝试别的数据,分别用Json和jdk试试,这里Json序列化占用内存更小,为什么会出现这样的情况?
image.png
image.png
以下是测试的方法:

@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;    }

共有1个答案

楚和悌
2024-01-24

JSON

基于字符,于是非字符的东西占用空间更多,比如数字,比如二进制,比如 bool
因为是字符所以可读,可编辑
另外是一种语言无关的格式,啥程序都能读

JDK 序列化

相比于其他二进制序列化,存了类型等等一些额外的东西,所以也没高效多少,但是因为是二进制的,所以存二进制数据相对更省空间
但是这玩意只有 Java程序可以读,而且只能程序读,直接看数据基本看不明白是啥,更不用说修改

 类似资料:
  • 本文向大家介绍java对象的序列化和反序列化,包括了java对象的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java对象的序列化和反序列化,供大家参考,具体内容如下 1. 什么是序列化        将对象转换为字节流保存起来,比如保存到文件里,并在以后还原这个对象,这种机制叫做对象序列化。(补充一句:把对象保存到永久存储设备上称为持久化) 2. 怎么实现序列化

  • 试图将JSON反序列化为我创建的Java bean。对杰克逊和这项努力来说真的很新鲜,所以请容忍我。我有以下几点: 由于JSON中的对象被反复使用,我的Java Bean被分解为几个部分,因此: ...和以类似方式实现的另一个BlockBean类(为简洁起见省略)。我使用杰克逊来完成这个任务,我的问题是——杰克逊中是否有序列化和反序列化的机制?理想情况下,我想要这样的东西(下面是伪代码,因为我无法

  • 主要内容:1 Java序列化和反序列化,2 Java序列化的优点,3 java.io.Serializable接口,4 Java ObjectOutputStream,5 Java ObjectInputStream,6 Java序列化的例子,7 Java反序列化的例子1 Java序列化和反序列化 Java中的序列化是一种将对象状态写入字节流的机制。它主要用于Hibernate,RMI,JPA,EJB和JMS技术。 序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台

  • 本文向大家介绍详解Java 对象序列化和反序列化,包括了详解Java 对象序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反。在我们看来这种行为实在是繁琐,尤其是在这个对象中属性值很多的时候。基于此,Java中对象的序列

  • 我试图序列化一个对象数组,并将其写入一个名为address.ser的文件,然后从该文件中读取,反序列化对象数组并显示其属性。我尝试一次序列化整个arrayList(读取时在单个会话中反序列化它),也尝试一个接一个地序列化对象数组的每个对象(读取时一个接一个地反序列化它)。问题是,当从address.ser文件读回来时,我只得到最后一个被写入的对象的数据,而不是其他的。 以下是代码片段: 这是用于将

  • 问题内容: 我已经开始在我的第一个android应用程序上进行工作,并且具有处理多层图像的应用程序。我能够将项目文件的平面版本导出为PNG,但我希望能够保存分层图像以供以后编辑(包括应用于某些层的任何选项,例如基于文本的层)。 无论如何,我已经确保需要写入文件的类是“可序列化的”,但是由于android.graphics.Bitmap不可序列化这一事实而遇到了一些障碍。以下代码实质上将位图作为PN