ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# **1. 序列化与反序列化** ## **1.1 序列化** 1. Java序列化能够将实例对象写入字节流中(**只序列化对象属性值,而不序列化方法**) 2. 序列化后的对象(字节信息)可用于网络传输、持久化到数据库、磁盘中 ## **1.2 反序列化** 需要对象的时候,再从序列化出来的字节信息中构造出原来的对象 # **2. 实现序列化** `Java`中要使一个类可以序列化,实现`java.io.Serializable` 接口 1. user对象 ~~~ @Data public class User implements Serializable { private static final long serialVersionUID = 1L; private String name; private String age; } ~~~ 2. 测试 ~~~ public class serializeTest { public static void main(String[] args) throws Exception { User user = new User(); user.setName("fufu"); user.setAge("18"); serialize(user); System.out.println("Java序列化前的结果:{} " + user.toString()); User duser = deserialize(); System.out.println("Java反序列化的结果:{} " + duser.toString()); } private static void serialize(User user) throws Exception { ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("C:\\Users\\93130\\Desktop\\user.txt"))); oos.writeObject(user); oos.close(); } private static User deserialize() throws Exception { ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("C:\\Users\\93130\\Desktop\\user.txt"))); return (User) ois.readObject(); } } ~~~ 输出 ``` Java序列化前的结果:{} User(name=fufu, age=18) Java反序列化的结果:{} User(name=fufu, age=18) ``` 产生文件 ![](https://img.kancloud.cn/c7/4f/c74f3d139ed479c555232bd70bd05be9_713x257.png) # 3. **`serialVersionUID`** 属性 1. 因为序列化对象时,如果不显示的设置`serialVersionUID`,Java在序列化时会根据对象属性自动的生成一个`serialVersionUID`,再进行存储或用作网络传输。 2. 在反序列化时,会根据对象属性自动再生成一个新的`serialVersionUID`,和序列化时生成的`serialVersionUID`进行比对,两个`serialVersionUID`相同则反序列化成功,否则就会抛异常。 3. 而当显示的设置`serialVersionUID`后,Java在序列化和反序列化对象时,生成的`serialVersionUID`都为我们设定的`serialVersionUID`,这样就保证了反序列化的成功。 例如将对象user序列化后,对user对象源码进行了修改,此时再去反序列化会报错,因为serialVersionUID不一样了;如果显示指定则可以避免处理类情况 # 4. **transient** 序列化对象时如果希望哪个属性不被序列化,则用`transient`关键字修饰即可 ~~~ @Data public class User implements Serializable { private transient String name; private String age; } ~~~ 可以看到字段`name`的值没有被保存到磁盘中,一旦变量被`transient`修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。 复制 ~~~ Java序列化前的结果: User(name=fufu, age=18) Java反序列化的结果:User(name=null, age=18) ~~~ 一个静态变量不管是否被`transient`修饰,均不能被序列化。 因为`static`修饰的属性是属于类,而非对象。