Java序列化和反序列化
1 Java序列化和反序列化
Java中的序列化是一种将对象状态写入字节流的机制。它主要用于Hibernate,RMI,JPA,EJB和JMS技术。
序列化的反向操作称为反序列化,其中字节流被转换为对象。序列化和反序列化过程与平台无关,这意味着您可以序列化平台中的对象并在不同平台中反序列化。
为了序列化对象,我们调用ObjectOutputStream类的writeObject()方法,而反序列化,我们调用ObjectInputStream类的readObject()方法。
不管是序列化还是反序列化,对象都必须实现Serializable接口。
2 Java序列化的优点
Java序列化主要用于在网络上传播对象(称为封送处理)。
3 java.io.Serializable接口
Serializable是标记接口(接口没有任何的属性和方法)。它用于“标记”Java类,以便这些类的对象可以具有一定的功能。Cloneable和Remote也是标记器接口。
默认情况下,String类和所有包装类都实现java.io.Serializable接口。
让我们看下面的例子:
package com.yiidian;
/**
* 一点教程网: http://www.yiidian.com
*/
/**
* Java Serializable的例子
*/
import java.io.Serializable;
public class Student implements Serializable{
int id;
String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
}
在上面的示例中,Student类实现了Serializable接口。现在可以将其对象转换为流。
4 Java ObjectOutputStream
ObjectOutputStream类用于将原始数据类型和Java对象写入OutputStream。只有实现java.io.Serializable接口的对象才能写入流。
4.1 ObjectOutputStream构造方法
构造方法 | 描述 |
---|---|
public ObjectOutputStream(OutputStream out) throws IOException {} | 创建一个ObjectOutputStream写入指定的OutputStream。 |
4.2 ObjectOutputStream方法
方法 | 描述 |
---|---|
public final void writeObject(Object obj) throws IOException {} | 将指定的对象写入ObjectOutputStream。 |
public void flush() throws IOException {} | 刷新当前输出流。 |
public void close() throws IOException {} | 关闭当前输出流。 |
5 Java ObjectInputStream
ObjectInputStream反序列化使用ObjectOutputStream编写的对象和原始数据。
5.1 ObjectInputStream构造方法
构造方法 | 描述 |
---|---|
public ObjectInputStream(InputStream in) throws IOException {} | 创建一个ObjectInputStream,它从指定的InputStream读取。 |
5.2 ObjectInputStream方法
方法 | 描述 |
---|---|
public final Object readObject() throws IOException, ClassNotFoundException{} | 从输入流中读取一个对象。 |
public void close() throws IOException {} | 关闭ObjectInputStream。 |
6 Java序列化的例子
在此示例中,我们将序列化Student类的对象。ObjectOutputStream类的writeObject()方法提供了序列化对象的功能。我们将对象的信息保存在file.txt文件中。
Student.java:
package com.yiidian;
import java.io.Serializable;
/**
*一点教程网: http://www.yiidian.com
*/
public class Student implements Serializable{
private int id;
private String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public Student() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Demo.java:
package com.yiidian;
/**
* 一点教程网: http://www.yiidian.com
*/
/**
* Java 序列化的例子
*/
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class Demo{
public static void main(String args[]){
try{
//Creating the object
Student s1 =new Student(211,"eric");
//Creating stream and writing the object
FileOutputStream fout=new FileOutputStream("file.txt");
ObjectOutputStream out=new ObjectOutputStream(fout);
out.writeObject(s1);
out.flush();
//closing the stream
out.close();
System.out.println("success");
}catch(Exception e){System.out.println(e);}
}
}
输出结果为:
success
7 Java反序列化的例子
反序列化是从序列化状态重建对象的过程。这是序列化的反向操作。让我们看一个示例,该示例从反序列化的对象读取数据。
package com.yiidian;
/**
* 一点教程网: http://www.yiidian.com
*/
/**
* Java 反序列化的例子
*/
import java.io.*;
class Demo{
public static void main(String args[]){
try{
//Creating stream to read the object
ObjectInputStream in=new ObjectInputStream(new FileInputStream("file.txt"));
Student s=(Student)in.readObject();
//printing the data of the serialized object
System.out.println(s.getId()+" "+s.getName());
//closing the stream
in.close();
}catch(Exception e){System.out.println(e);}
}
}
输出结果为:
211 eric
热门文章
优秀文章