黑马程序员技术交流社区

标题: 【记录】代码练习-序列化和反序列化流 [打印本页]

作者: Kevin.Kang    时间: 2015-7-30 13:20
标题: 【记录】代码练习-序列化和反序列化流
序列化和反序列化:
  1. package com.kxg_02;

  2. import java.io.EOFException;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.ObjectInputStream;
  7. import java.io.ObjectOutputStream;

  8. /*
  9. * 序列化流:把对象按照流一样的方式存入文本文件或者网络中传输。        对象--流数据(ObjectOutputStream)
  10. * 反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据--对象(ObjectInputStream)
  11. */
  12. public class ObjectStreamDemo {
  13.         public static void main(String[] args) throws IOException,
  14.                         ClassNotFoundException {
  15.                 write();
  16.                 read();

  17.         }

  18.         private static void read() throws IOException, ClassNotFoundException {
  19.                 // 创建反序列化流
  20.                 ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
  21.                                 "oos.txt"));

  22.                 try {
  23.                         // 不知道要运行几次用while,最后会报一个EOFException的错误,自己做一下处理就行。
  24.                         while(true)
  25.                         {
  26.                                 Object obj = ois.readObject();
  27.                                 System.out.println(obj);
  28.                         }
  29.                 } catch (EOFException e) {
  30.                         System.out.println("反序列化结束!");
  31.                 }
  32.         }

  33.         private static void write() throws IOException {
  34.                 // 创建序列化流
  35.                 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
  36.                                 "oos.txt"));

  37.                 // 创建对象
  38.                 Person p1 = new Person("李延旭", 20);
  39.                 Person p2 = new Person("任兴亚", 23);
  40.                 Person p3 = new Person("赵磊", 20);
  41.                 Person p4 = new Person("王澳", 21);

  42.                 // 把对象添加到流中
  43.                 oos.writeObject(p1);
  44.                 oos.writeObject(p2);
  45.                 oos.writeObject(p3);
  46.                 oos.writeObject(p4);

  47.                 oos.close();
  48.         }
  49. }
复制代码




作者: Kevin.Kang    时间: 2015-7-30 13:22
本帖最后由 Kevin.Kang 于 2015-7-30 13:27 编辑

对象类:
Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常
  1. package com.kxg_02;

  2. import java.io.Serializable;

  3. /*
  4. * 需要进行序列化和反序列化的类必须实现Serializable接口
  5. * 该接口没有任何方法,类似于这种没有方法的接口被称为标记接口
  6. *
  7. * 类还需要添加一个serialVersionUID
  8. */
  9. public class Person implements Serializable {
  10.         /**
  11.          *
  12.          */
  13.         private static final long serialVersionUID = 1L;
  14.         private String name;
  15.         private int age;

  16.         public String getName() {
  17.                 return name;
  18.         }

  19.         public void setName(String name) {
  20.                 this.name = name;
  21.         }

  22.         public int getAge() {
  23.                 return age;
  24.         }

  25.         public void setAge(int age) {
  26.                 this.age = age;
  27.         }

  28.         @Override
  29.         public String toString() {
  30.                 return "Person [name=" + name + ", age=" + age + "]";
  31.         }

  32.         public Person(String name, int age) {
  33.                 super();
  34.                 this.name = name;
  35.                 this.age = age;
  36.         }

  37.         public Person() {
  38.                 super();
  39.         }
  40. }
复制代码

使用transient关键字修饰的成员变量就不能进行序列化


作者: 风一样的少年    时间: 2015-7-30 13:53
感觉很深奥
作者: 耀阳圣尊    时间: 2015-7-30 15:20
赞一赞




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2