1.什么是序列化与反序列化
java对象的序列化是指把对象转化为字节序列的过程;而把字节序列恢复为对象的过程为反序列化。
2.序列化的目的
对象的序列化可用于java的远程方法调用(RMI),它使存在于其他计算机上的对象使用起来就像在自己计算机一样,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象;另外,序列化也可以实现对象状态的持久性,可以把内存中的对象状态保存到一个文件中或者数据库中,需要时再通过反序列化恢复为原来的对象。
3.实现序列化与反序列化的步骤
实现序列化:
-
-
ObjectOutputStream objectOutputStream = new ObjectOutputStream( new FileOutputStream(new File("E:/Student.txt")));
-
-
objectOutputStream.writeObject(student);
-
-
objectOutputStream.close();
实现反序列化:
-
-
ObjectInputStream objectOutputStream = new ObjectInputStream(new FileInputStream(new File("E:/Student.txt")));
-
-
Student student = (Student) objectOutputStream.readObject();
-
-
objectOutputStream.close();
4.注意
a)只有对象实现了Serializable接口(该接口仅是一个标记接口,不包括任何方法,仅用于标识可序列化的语义),才能被序列化
b)可序列化类的所有子类型本身都是可序列化的
c)序列化时只对对象的状态(属性)进行保存,而不对方法进行处理
5.序列化与反序列化的实例:
首先定义一个Student类,实现Serializable接口
-
package main;
-
-
import java.io.Serializable;
-
-
public class Student implements Serializable {
-
-
//序列化的版本号,凡是实现Serializable接口的类都会有一个标示序列化版本号的静态变量。
-
private static final long serialVersionUID = 8425025706255245700L;
-
-
private String name;
-
private int number;
-
-
public Student() {
-
}
-
-
public Student(String name, int number) {
-
super();
-
this.name = name;
-
this.number = number;
-
}
-
-
public String getName() {
-
return name;
-
}
-
-
public void setName(String name) {
-
this.name = name;
-
}
-
-
public int getNumber() {
-
return number;
-
}
-
-
public void setNumber(int number) {
-
this.number = number;
-
}
-
-
@Override
-
public String toString() {
-
return "Student [name=" + name + ", number=" + number + "]";
-
}
-
}
实现Student对象的序列化与反序列化:
-
package main;
-
-
import java.io.File;
-
import java.io.FileInputStream;
-
import java.io.FileOutputStream;
-
import java.io.IOException;
-
import java.io.ObjectInputStream;
-
import java.io.ObjectOutputStream;
-
import java.text.MessageFormat;
-
-
public class Test {
-
-
public static void main(String[] args) throws Exception {
-
SerializeStudent();
-
-
Student student = DeserializeStudent();
-
System.out.println(MessageFormat.format("name={0},number={1}", student.getName(), student.getNumber()));
-
-
// System.out.println(student);
-
}
-
-
// 序列化
-
private static void SerializeStudent() throws IOException {
-
-
Student student = new Student("cxk", 152107);
-
-
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
-
new FileOutputStream(new File("E:/Student.txt")));
-
objectOutputStream.writeObject(student);
-
-
System.out.println("Student序列化成功");
-
-
objectOutputStream.close();
-
}
-
-
// 反序列化
-
private static Student DeserializeStudent() throws Exception {
-
-
ObjectInputStream objectOutputStream = new ObjectInputStream(
-
new FileInputStream(new File("E:/Student.txt")));
-
Student student = (Student) objectOutputStream.readObject();
-
-
System.out.println("Student对象反序列化成功!");
-
-
objectOutputStream.close();
-
-
return student;
-
}
-
}
这样就把student对象的状态保存到了文件中,并可通过反序列化把状态恢复。运行结果显示为:
-
Student序列化成功
-
Student对象反序列化成功!
-
name=cxk,number=152,107
若把main函数中的System.out.Println(MessageFormat...)换成下面注释掉的那句,则显示格式变为Student类中定义的ToString方法定义的格式。
-
Student序列化成功
-
Student对象反序列化成功!
-
Student [name=cxk, number=152107]
6.android中新的序列化方式
在android中实现序列化,除了实现Serializable 接口外,也可以实现Parceable接口。 Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。两种方式的区别在此就不列出了,具体可以看看
http://www.cnblogs.com/renqingping/archive/2012/10/25/Parcelable.html这篇博文。
阅读(700) | 评论(0) | 转发(0) |