序列化和反序列化

it2023-05-18  69

核心总结

1、序列化:java对象存储到文件中 2、反序列化:硬盘上的数据重新恢复到内存,恢复java对象 3、实现Serializable接口,建议手动写版本号 private static final long serialVersionUID=1l;后期改代码,java虚拟机认为是同一个类 4、类名一样,实现Serializable可以区分类

序列化和反序列化的理解 Serializable

1、java.io.NotSerializableException,没有实现Serializable 2、参与序列化和反序列化接口必须实现Serializable接口 3、public interface Serializable { } 里面什么都没有,可能起到标识、标志作用,可能会对这个类特殊待遇 4、Serializable 这个标志接口,是给java虚拟机参考的,java虚拟机看到这个接口后,会为这个类自动生成一个序列胡版本号

5、序列化版本号有什么用? 2个类名一样,可以去实现Serializable接口,区分类名。

6、java语言采用什么机制区分类 1.首先通过类名比对,如果类名不一样,肯定不是一个类。 2.如果类名一样,靠序列化版本号区分。(java虚拟机看到Serializable接口,会自动生成一个序列化版本号。)

请思考:这种自动生成序列化版本号有什么缺陷? 一旦代码确定后,不能进行后续代码的修改 因为只要修改,必然重新编译,此时会自动生成全新的序列化版本号,这个时候,java虚拟机会认为这是一个全新的类。 最终结论:凡是一个类实现了Serializable接口,建议给该类提供一个固定不变的序列化版本号。这样,以后即使修改了代码,但是版本号不变,java虚拟机会认为是同一个类。 建议:版本号手动写出来。 private static final long serialVersionUID=1l;

序列化,反序列化(先运行序列化)

package com; import java.io.*; /** * 序列化 */ public class Test { public static void main(String[] args) throws IOException { //创建java对象 Student s = new Student(18, "zs"); //序列化 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("students")); //序列化对象 oos.writeObject(s); //刷新 oos.flush(); //关闭 oos.close(); } } class Student implements Serializable{ private int age; private String name; @Override public String toString() { return "Student{" + "age=" + age + ", name='" + name + '\'' + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Student() { } public Student(int age, String name) { this.age = age; this.name = name; } } /** *反序列化、必须先执行序列化,再执行反序列化 */ class ObjectInputStreamTest{ public static void main(String[] args) throws Exception { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("students")); //开始反序列化,读 Object object = ois.readObject(); //反序列化回来是一个对象,所有会调用学生对象的toString(); System.out.println(object); ois.close(); } }

序列化对象和反序列化对象

package com; import java.io.*; import java.util.ArrayList; import java.util.List; /** * 一次序列化多个对象 * 可以,可以将对象放在集合,序列化集合 */ public class Test { public static void main(String[] args) throws IOException { ArrayList<User> userArrayList = new ArrayList<>(); userArrayList.add(new User(1, "zs")); userArrayList.add(new User(2, "lisi")); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("users")); //序列化一个集合,这个集合放很多其他对象 oos.writeObject(userArrayList); oos.flush(); oos.close(); } } class User implements Serializable{ private int no; private String name; @Override public String toString() { return "User{" + "no=" + no + ", name='" + name + '\'' + '}'; } public int getNo() { return no; } public void setNo(int no) { this.no = no; } public String getName() { return name; } public void setName(String name) { this.name = name; } public User() { } public User(int no, String name) { this.no = no; this.name = name; } } class ObjectInputStreamTest{ public static void main(String[] args) throws Exception { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("users")); List<User> userList = (List<User>)ois.readObject(); for (User user:userList){ System.out.println(user); } ois.close(); } }

transient关键字修饰不参与序列化

最新回复(0)