0%

序列化

序列化

序列化

  • 定义:将对象根据一定的格式转换为字节数组。

  • 需要序列化的原因:存储和网络传输都需要经过把一个对象状态保存成一种跨平台识别的字节格式,IO支持的数据格式是字节数组。

  • 用途:IO传输对象时,即跨平台存储,网络传输。

  • 实际场景:存到redis,微服务之间调用传输对象。

  • 做了什么:将要保存的数据,转换成字节码的形式,反序列化就是把字节码变成数据。

redis序列化

默认的JdkSerializationRedisSerializer存储时是二进制,redis中查看是乱码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* Redis序列化配置
*
*/
@Configuration
public class RedisConfig {
@Autowired
private RedisConnectionFactory factory;

@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());// key一般不是对象,String实现性能高
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());// value可能是对象,采用spring提供的Jackson序列化
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(factory);
return redisTemplate;
}
}

java序列化

  • 实现原理

    通过serialVersionUID实现,JVM会在运行时判断类的serialVersionUID属性来验证版本一致性,如果传来的字节流中的serialVersionUID与本地相应类的serialVersionUID相同则认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

    类实现了Serializable 接口,JVM会根据类的整体信息生成serialVersionUID,类修改时,JVM会重新生成serialVersionUID。一般实践中会显示的定义类的serialVersionUID