序列化与反序列化
Java序列化是指把Java对象转换为字节序列的过程;
反序列化是指把字节序列恢复为Java对象。
对象存redis的对象需要序列化,mysql却不用
在Java中,当你需要将对象存储到Redis时,
- 由于Redis不是键值存储,它需要将对象转换为字节流进行存储,因此需要对对象进行序列化。
- MySQL是关系型数据库,它可以直接存储对象,通常使用JDBC或ORM框架(如Hibernate或MyBatis)与数据库进行交互,这些工具负责将对象映射到SQL语句。
简单来说,Redis需要序列化对象,而MySQL通常不需要。
java虚拟机内存和redis内存是两块独立的内存空间,分属于两个不同的进程,不同的两个应用,在网络传输层表现为数据传输是用TCP二进制流进行传输的
序列化最终的目的是为了对象可以跨平台存储,和进行网络传输。 而跨平台存储和网络传输的方式就是IO,而我们的IO支持的数据格式就是字节数组。
Vo类
实现序列化类Serializable
private static final long serialVersionUID = 1L;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.io.Serializable;@Data
@NoArgsConstructor
@AllArgsConstructor
public class MemberLoginVO implements Serializable {private static final long serialVersionUID = 1L;private Integer id;private String username;private String email;}
Java的序列化机制是通过类的serversionUID来验证版本一致性的。在反序列化时,JVM会将传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常【InvalidCastException】
分布式架构注意
分布式架构中,网关可能会需要entity下的Vo,一定一定在pom.xml吧entity引入一下,不然及时redis存了值,但网关还是过不去,找不到对应的Vo.