1.对象输入输出流
ObjectOutputStream和ObjectInputStream可以用来实现对象序列化和反序列化操作。一般操作对象时,对象是存在内存中的,如果希望将对象保存在硬盘上,或者在网络间传输,这是需要将一个对象序列化为字节序列,这个过程就叫做对象的序列化操作。相应的,如果需要将该字节序列再转换为对应的对象,这个过程就是反序列化。Java序列化时会保存类的所有信息,包括属性、方法以及继承关系等等,因此完整但是略显臃肿,在网络传输过程中,有很多其他的对象序列化工具。
重要知识点:反序列化创建对象并没有调用构造方法!So,创造对象一定要调用构造方法是错误的!
(1)ObjectOutputStream是用来对对象进行序列化的输出流。
其实现对象序列化的方法为:
void writeObject(Object o)
该方法可以将给定的对象转换为一个字节序列后写出。
-
-
-
-
-
-
-
-
-
-
-
-
- public class T06ObjectOutputStream {
- public static void main(String[] args) {
- Person p=new Person();
- p.setAge(11);
- p.setGender("女");
- p.setName("张三");
- List<String> otherInfo=new ArrayList<String>();
- p.setOtherInfo(otherInfo);
-
- FileOutputStream fos=null;
- ObjectOutputStream oos=null;
- try {
- fos = new FileOutputStream(new File("oos"));
- oos=new ObjectOutputStream(fos);
- oos.writeObject(p);
-
-
-
-
-
-
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }finally{
- try {
- oos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- }
- }
特别注意:其中序列化的Person类需要实现Serializable接口,否则会报NotSerializableException异常。
Serializable接口很特殊,没有任何方法,相当于对类做一个标志,成为标志接口。
-
- public class Person implements Serializable{...}
(2)
ObjectInputStream是用来对对象进行反序列化的输入流。
其实现对象反序列化的方法为:
Object readObject()
该方法可以从流中读取字节并转换为对应的对象。
如果声明的类序列化存到硬盘上面,之后对该类进行修改,那么当反序列化时,就会出现InvalidClassException,这样就会造成不兼容性的问题。
serialVersionUID是用来记录class文件的版本信息的,seroalVersionUID这个数字是通过一个类的类名,成员,包名,工程名算出的一个数字。
使用ObjectInputStream进行反序列化的时候,ObjectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件serialVersionUID进行对比,如果两个ID号不一致,反序列化就失败了。在方法里加syso("。。。");还是可以成功,因为方法名没有改变。
可以给类指定一个serialVersionUID,这样java虚拟机不会再自己去算serialVersionUID了。
-
-
-
-
-
-
-
-
-
- public class T07ObjectInputStream {
- public static void main(String[] args) {
- File file=new File("oos");
- FileInputStream fis;
- try {
-
-
-
-
- fis = new FileInputStream(file);
- ObjectInputStream ois=new ObjectInputStream(fis);
- Person p=(Person) ois.readObject();
-
-
-
- System.out.println(p);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- }