[] 进制 方式 gets 创建 保存 ati 取数据
Java 序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现 Java 序列化与反序列化?本文围绕这些问题进行了探讨。
1.Java 序列化与反序列化
Java 序列化是指把 Java 对象转换为字节序列的过程;而 Java 反序列化是指把字节序列恢复为 Java 对象的过程。
2. 为什么需要序列化与反序列化
我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。那么当两个 Java 进程进行通信时,能否实现进程间的对象传送呢?答案是可以的。如何做到呢?这就需要 Java 序列化与反序列化了。换句话说,一方面,发送方需要把这个 Java 对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出 Java 对象。
当我们明晰了为什么需要 Java 序列化和反序列化后,我们很自然地会想 Java 序列化的好处。其好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。
3. 如何实现 Java 序列化与反序列化
1)JDK 类库中序列化 API
java.io.ObjectOutputStream:表示对象输出流
它的 writeObject(Object obj) 方法可以对参数指定的 obj 对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream:表示对象输入流
它的 readObject() 方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。
2)实现序列化的要求
只有实现了 Serializable 或 Externalizable 接口的类的对象才能被序列化,否则抛出异常。
3)实现 Java 对象序列化与反序列化的方法
假定一个 Student 类,它的对象需要序列化,可以有如下三种方法:
方法一:若 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)JDK 类库中序列化的步骤
步骤一:创建一个对象输出流,它可以包装一个其它类型的目标输出流,如文件输出流:
ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream("D:\\objectfile.obj"));
步骤二:通过对象输出流的 writeObject() 方法写对象:
out.writeObject("Hello");
out.writeObject(new Date());
5)JDK 类库中反序列化的步骤
步骤一:创建一个对象输入流,它可以包装一个其它类型输入流,如文件输入流:
ObjectInputStream in = new ObjectInputStream(new fileInputStream("D:\\objectfile.obj"));
步骤二:通过对象输出流的 readObject() 方法读取对象:
String obj1 = (String)in.readObject();
Date obj2 = (Date)in.readObject();
说明:为了正确读取数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输入流中读对象的顺序一致。
为了更好地理解 Java 序列化与反序列化,选择方法一编码实现。
Student 类定义如下:
- 1 package com.jieke.io;
- 2 import java.io.Serializable;
- 3
- 4 /**
- 5 *Title:学生类
- 6 *Description:实现序列化接口的学生类
- 7 *Copyright: copyright(c) 2012
- 8 *Filename: Student.java
- 9 *@author Wang Luqing
- 10 *@version 1.0
- 11 */
- 12 public classStudentimplements Serializable
- 13 {
- 14 private String name;
- 15 private char sex;
- 16 private int year;
- 17 private double gpa;
- 18
- 19 public Student()
- 20 {
- 21
- 22 }
- 23 publicStudent(String name,charsex,intyear,double gpa)
- 24 {
- 25 this.name = name;
- 26 this.sex = sex;
- 27 this.year = year;
- 28 this.gpa = gpa;
- 29 }
- 30
- 31 public void setName(String name)
- 32 {
- 33 this.name = name;
- 34 }
- 35
- 36 public voidsetSex(char sex)
- 37 {
- 38 this.sex = sex;
- 39 }
- 40
- 41 public voidsetYear(int year)
- 42 {
- 43 this.year = year;
- 44 }
- 45
- 46 public voidsetGpa(double gpa)
- 47 {
- 48 this.gpa = gpa;
- 49 }
- 50
- 51 public String getName()
- 52 {
- 53 return this.name;
- 54 }
- 55
- 56 public char getSex()
- 57 {
- 58 return this.sex;
- 59 }
- 60
- 61 public int getYear()
- 62 {
- 63 return this.year;
- 64 }
- 65
- 66 public double getGpa()
- 67 {
- 68 return this.gpa;
- 69 }
- 70}
把 Student 类的对象序列化到文件 O:\\Java\\com\\jieke\\io\\student.txt,并从该文件中反序列化,向 console 显示结果。代码如下:
- 1 import java.io. * ;
- 2 3
- /**
- 4 *Title:应用学生类
- 5 *Description:实现学生类实例的序列化与反序列化
- 6 *Copyright: copyright(c) 2012
- 7 *Filename: UseStudent.java
- 8 *@author Wang Luqing
- 9 *@version 1.0
- 10 */
- 11 12 public class UseStudent 13 {
- 14 public static void main(String[] args) 15 {
- 16 Student st = new Student("Tom", 'M', 20, 3.6);
- 17 File file = new File("O:\\Java\\com\\jieke\\io\\student.txt");
- 18
- try 19 {
- 20 file.createNewFile();
- 21
- }
- 22
- catch(IOException e) 23 {
- 24 e.printStackTrace();
- 25
- }
- 26
- try 27 {
- 28 //Student对象序列化过程
- 29 FileOutputStream fos = new FileOutputStream(file);
- 30 ObjectOutputStream oos = new ObjectOutputStream(fos);
- 31 oos.writeObject(st);
- 32 oos.flush();
- 33 oos.close();
- 34 fos.close();
- 35 36 //Student对象反序列化过程
- 37 FileInputStream fis = new FileInputStream(file);
- 38 ObjectInputStream ois = new ObjectInputStream(fis);
- 39 Student st1 = (Student) ois.readObject();
- 40 System.out.println("name = " + st1.getName());
- 41 System.out.println("sex = " + st1.getSex());
- 42 System.out.println("year = " + st1.getYear());
- 43 System.out.println("gpa = " + st1.getGpa());
- 44 ois.close();
- 45 fis.close();
- 46
- }
- 47
- catch(ClassNotFoundException e) 48 {
- 49 e.printStackTrace();
- 50
- }
- 51
- catch(IOException e) 52 {
- 53 e.printStackTrace();
- 54
- }
- 55
- }
- 56
- }
结果如下所示:
name = Tom
sex = M
year = 20
gpa = 3.6
总结:
1)Java 序列化就是把对象转换成字节序列,而 Java 反序列化就是把字节序列还原成 Java 对象。
2)采用 Java 序列化与反序列化技术,一是可以实现数据的持久化,在 MVC 模式中很是有用;二是可以对象数据的远程通信。
本文转自 http://blog.csdn.net/wangloveall/article/details/7992448/
Java 序列化与反序列化
来源: http://www.bubuko.com/infodetail-2145836.html