概述
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据
、对象的类型
和对象中存储的数据
信息,都可以用来在内存中创建对象。
1.序列化和反序列化的定义:
(1).Java序列化就是指把Java对象转换为字节序列的过程。
(2). Java反序列化就是指把字节序列恢复为Java对象的过程。
2.Java实现序列化和反序列化的过程:
(1). java.io.ObjectInputStream:对象输入流。
该类的readObject()方法从输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。
(2). java.io.ObjectOutputStream:对象输出流。
该类的writeObject(Object obj)方法将将传入的obj对象进行序列化,把得到的字节序列写入到目标输出流中进行输出。
3.实现序列化和反序列化的三种实现:
①若Student类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化。
- ObjectOutputStream采用默认的序列化方式,对Student对象的非transient的实例变量进行序列化。
- ObjcetInputStream采用默认的反序列化方式,对Student对象的非transient的实例变量进行反序列化。
②若Student类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。
- ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的方法进行序列化。
- ObjectInputStream会调用Student对象的readObject(ObjectInputStream in)的方法进行反序列化。
③若Student类实现了Externalnalizable接口,且Student类必须实现readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。
- ObjectOutputStream调用Student对象的writeExternal(ObjectOutput out))的方法进行序列化。
- ObjectInputStream会调用Student对象的readExternal(ObjectInput in)的方法进行反序列化。
4.序列化和反序列化代码示例
public class SerializableTest { public static void main(String[] args) throws IOException, ClassNotFoundException { //序列化 FileOutputStream fos = new FileOutputStream("object.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); Student student1 = new Student("lihao", "wjwlh", "21"); oos.writeObject(student1); oos.flush(); oos.close(); //反序列化 FileInputStream fis = new FileInputStream("object.out"); ObjectInputStream ois = new ObjectInputStream(fis); Student student2 = (Student) ois.readObject(); System.out.println(student2.getUserName()+ " " + student2.getPassword() + " " + student2.getYear()); } }
public class GirlFriend implements Serializable { private String gender; private String isAlive; private String isBeautiful; public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getIsAlive() { return isAlive; } public void setIsAlive(String isAlive) { this.isAlive = isAlive; } public String getIsBeautiful() { return isBeautiful; } public void setIsBeautiful(String isBeautiful) { this.isBeautiful = isBeautiful; }
Ø序列化示图
Ø反序列化示图
5.序列化和反序列化的注意点:
- 序列化时,只对对象的状态进行保存,而不管对象的方法。
- 当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口。
- 当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化。
- 声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态,transient代表对象的临时数据。
- Java有很多基础类已经实现了serializable接口,比如String,Vector等。但是也有一些没有实现serializable接口的。
心得:
生如蝼蚁当立鸿鹄之志;
命薄似纸应有不屈之心;
乾坤未定;
你我皆是黑马。