Java——serialize与deserialize

一级目录

二级目录

三级目录

序列化 (对象 —> 字节流 )

后端传给前端时:

  1. 想只传非null的字段,可以用@JsonInclude(JsonInclude.Include.NON_NULL)
  2. 或者某些字段不需要传,直接用 @JsonIgnore

反序列化 (字节流 --> 对象)

反序列化会用到字段的get、set方法,一般情况下前端到后端、数据库到后端时,两边的字段类型应该是一致的。对于那些不一致的情况(比如数据库是 int,后端是Enum ; 数据库是String,后端是List),这种时候可以给字段加上@Convert注解,手动修改序列化、 反序列化的方法。

### 如何在 Java 中实现 `Serializable` 接口 为了使一个类能够被序列化,在 Java 中只需要让该类实现 `java.io.Serializable` 接口即可。这实际上是一个标记接口,不需要提供任何方法的实现。 #### 定义 `serialVersionUID` 建议显式地定义一个名为 `serialVersionUID` 的静态变量来控制版本兼容性。如果不手动指定,默认会基于类名、接口名、成员方法以及属性等自动生成。当类结构发生变化时(比如增加或移除字段),默认生成的 `serialVersionUID` 可能会发生变化从而导致反序列化失败。因此推荐固定此值以确保不同版本间的向后兼容性[^1]。 ```java private static final long serialVersionUID = 1L; ``` #### 序列化条件 要成功完成对象的序列化过程,需满足以下两点: - 类本身实现了 `java.io.Serializable` 接口; - 所有非瞬态 (`transient`) 字段也都是可序列化的。对于那些不可序列化的字段,应该将其声明为 `transient` 关键字修饰,这样它们就不会参序列化进程[^3]。 #### 实现示例 下面给出一段简单的代码片段展示如何创建一个支持序列化的类,并对其进行基本操作: ```java import java.io.*; class Person implements Serializable { private static final long serialVersionUID = 8822818790694831649L; public String name; public int age; // Transient field will not be serialized. private transient String password; @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } public class SerializationDemo { public static void main(String[] args) throws IOException, ClassNotFoundException { // Create an object to serialize Person person = new Person(); person.name = "Alice"; person.age = 30; // Serialize the object into a file named 'person.ser' try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) { oos.writeObject(person); } System.out.println("Serialized data is saved in person.ser"); // Deserialize from a file back into an object try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) { Person deserializedPerson = (Person) ois.readObject(); System.out.println(deserializedPerson); // Output should match original values except for transient fields } } } ``` 上述例子展示了完整的序列化反序列化流程,包括处理瞬态字段的方式。即使后续对 `Person` 类进行了某些修改——例如增加了新的字段或是去除了旧有的字段——只要保持 `serialVersionUID` 不变,先前保存的数据仍然可以正常读取出来[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值