Java知识点复习 --->序列化
序列化
-
概念:序列化是将对象的状态信息转化为可以存储或者传输的形式的过程。在序列化期间,对象将其当前的状态写入临时或者持久性存储区。后面就可以从存储取中读取或者反序列化对象的状态,重新创建该对象。(重点是对象,是对对象的操作)
-
作用和用途:将对象转化为二进制数据进行操作。
-
Java中实现序列化的方式:
- 将需要进行序列化的类实现Serializable接口,然后使用ObjectOutputStream和ObjectInputStream进行对象的读写。
- 实现Serializable接口的类需要设置serialVersionUID,Java的序列化机制是在运行时判断类的serialVersionUID来验证版本是否一致。在进行反序列化的时候,JVM会把传过来的字节流中的serialVersionUID和本地实体类中的serialVersionUID进行对比,如果相同则认为是一致的,那么就可以进行反序列化,否则会抛出版本不一致的异常(如果不设置serialVersionUID,南那么在更改相应类中的属性(比如添加属性)时,进行反序列化就会出现问题)。
-
transient关键字作用:序列化和反序列化时是可以操作对象的所有属性的,如果希望对象的某些属性不被序列化或者不需要保存,那么直接在相应的属性上添加transient关键字即可。
-
静态变量序列化:序列化并不保存静态变量,序列化保存的是对象的状态,静态变量属于类的状态。下面的例子静态变量可以读取出内容是因为读取的值是JVM中的静态变量值,并不是反序列化得到的,这个可以从生成的文件中查看,文件中只有username属性。
public static void main(String[] args) { User user = new User(); user.setUsername("zyt"); user.setPasswd("123456"); System.out.println("read before Serializable: "); System.out.println("username: " + user.getUsername()); System.err.println("password: " + user.getPasswd()); System.err.println("age: " + User.age); // 静态变量 // 将User对象写进文件 try { ObjectOutputStream os = new ObjectOutputStream( new FileOutputStream("E:\\Android projects\\Compose_sample\\kotlin_algorithm\\user.txt")); os.writeObject(user); // 将User对象写进文件 os.flush(); os.close(); } catch (IOException e) { e.printStackTrace(); } // 从流中读取User的数据 try { User.age = 55; // 修改静态变量 ObjectInputStream is = new ObjectInputStream(new FileInputStream( "E:\\Android projects\\Compose_sample\\kotlin_algorithm\\user.txt")); user = (User) is.readObject(); is.close(); System.out.println("\nread after Serializable: "); System.out.println("username: " + user.getUsername()); System.err.println("password: " + user.getPasswd()); System.err.println("age: " + User.age); } catch (ClassNotFoundException | IOException e) { e.printStackTrace(); } } class User implements Serializable { // serialVersionUID 这个变量名必须为serialVersionUID private static final long serialVersionUID = 8294180014912103005L; private String username; private transient String passwd; // 不会进行序列化 static int age = 23; // 不会进行序列化 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPasswd() { return passwd; } public void setPasswd(String passwd) { this.passwd = passwd; } }输出结果:
read before Serializable: username: zyt password: 123456 // transient 修饰 age: 23 // 静态变量 read after Serializable: username: zyt password: null age: 55

浙公网安备 33010602011771号