序列化:将对象转为字节序列的过程。
package com.jmh.ppp;
import java.io.*;
public class Dog implements Serializable {
String name;
int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("dog.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Dog dog1 = new Dog("uzi", 1);
oos.writeObject(dog1);
oos.flush();
oos.close();
}
}
反序列化:将字节序列还原为对象的过程。
package com.jmh.ppp;
import java.io.*;
public class Dog implements Serializable {
String name;
int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public static void main(String[] args) throws IOException, ClassNotFoundException {
FileOutputStream fos = new FileOutputStream("dog.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Dog dog1 = new Dog("uzi", 1);
oos.writeObject(dog1);
oos.flush();
oos.close();
FileInputStream fis = new FileInputStream("dog.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Dog student2 = (Dog) ois.readObject();
System.out.println(student2.name + " " +
student2.age);
}
}
序列化和反序列化的作用:传递对象和保存对象时,保证对象的完整性和可传递性,以便在网络上传输和保存到本地上。反序列化通过序列化二进制流重建新的对象。
实现序列化:
1.实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。(不是则会抛出异常)
2.序列化反序列化对象:
- java.io.ObjectInputStream(对象输入流):输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。
- java.io.ObjectOutputStream(对象输出流):该类的writeObject(Object obj)方法将将传入的obj对象进行序列化,把得到的字节序列写入到目标输出流中进行输出。
注意事项:
-
1.序列化时,只对对象的状态进行保存,而不管对象的方法
-
当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
-
当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
-
不是所以的对象都能序列化:
1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行RMI传输等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的;
2.资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分配,而且,也是没有必要这样实现; -
声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态,transient代表对象的临时数据。



