Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程,如:把一个Java对象写入到磁盘或传输到网络上其他计算机中,此时需要通过Java序列化把对象转换成字节序列。
如何实现Java序列化与反序列化?
Java JDK类库中序列化API如下:
java.io.ObjectOutputStream:表示对象输出流,它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream:表示对象输入流,它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。
实现序列化必须满足的要求:
实现Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常。
下面为大家举例实现Serializable,代码如下:package com.test;
import java.io.*;
/**
* 素文宅 www.yoodb.com
*/
class Yoodb implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private transient String password;
private static int count = 0;
public Yoodb(String name, String password) {
System.out.println("调用Yoodb带参的构造函数");
this.name = name;
this.password = password;
count++;
}
public String toString() {
return "计数: " + count + " 姓名: " + name + " 密码: " + password;
}
}
public class ObjectSerTest {
public static void main(String args[]) {
try {
FileOutputStream fos = new FileOutputStream("yoodb.obj");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Yoodb y1 = new Yoodb("张三", "123456");
Yoodb y2 = new Yoodb("李四", "654321");
oos.writeObject(y1);
oos.writeObject(y2);
System.out.println(y1);
System.out.println(y2);
System.out.println("----------欢迎收藏本站www.yoodb.com----------------");
oos.close();
fos.close();
FileInputStream fis = new FileInputStream("yoodb.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
y1 = (Yoodb) ois.readObject();
y2 = (Yoodb) ois.readObject();
System.out.println(y1);
System.out.println(y2);
ois.close();
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
执行代码,输出结果如下:调用Yoodb带参的构造函数
调用Yoodb带参的构造函数
计数: 2 姓名: 张三 密码: 123456
计数: 2 姓名: 李四 密码: 654321
----------欢迎收藏本站www.yoodb.com----------------
计数: 2 姓名: 张三 密码: null
计数: 2 姓名: 李四 密码: null
读取文件流,代码如下:package com.test;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
/**
* 素文宅 www.yoodb.com
*/
public class Test{
public static void main(String args[]){
try {
FileInputStream fis = new FileInputStream("yoodb.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
Yoodb y1 = (Yoodb) ois.readObject();
Yoodb y2 = (Yoodb) ois.readObject();
System.out.println(y1);
System.out.println(y2);
ois.close();
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
执行代码,输出结果如下:计数: 0 姓名: 张三 密码: null
计数: 0 姓名: 李四 密码: null
注意:
Java中的序列化时transient变量和静态变量不会被序列化
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化
总结:
1)Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程
2)使用Java序列化和反序列化可以实现数据持久化,对象数据远程通信等功能