A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

序列化和反序列化:
  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. }
复制代码



3 个回复

倒序浏览
本帖最后由 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关键字修饰的成员变量就不能进行序列化

回复 使用道具 举报
感觉很深奥
回复 使用道具 举报
赞一赞
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马