下面是Java对象的序列化和反序列化的完整攻略:
概述
Java对象的序列化和反序列化是一种将对象转化成字节序列以便存储和传输的机制,同时也是将字节序列转化为对象的一种机制。
Java序列化通常用于将对象存储到文件中或者通过网络传输数据,反序列化则是将序列化后的字节流转换成原来的对象。
如何序列化和反序列化对象
Java对象的序列化和反序列化可以通过Java的标准库实现,具体使用方法如下:
序列化
将Java对象进行序列化,需要执行下面两个步骤:
- 实现Serializable接口
Java对象必须实现Serializable接口才可以进行序列化,Serializable是一个空的接口,只是起到可以序列化的标记作用,该接口中没有任何方法或属性。若未实现Serializable接口,会在序列化时抛出java.io.NotSerializableException异常。
- 调用ObjectOutputStream类实现序列化
使用ObjectOutputStream类可以方便的将Java对象进行序列化,使用该类进行序列化的基本步骤如下:
OutputStream outputStream = new FileOutputStream("file.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(object);
objectOutputStream.flush();
objectOutputStream.close();
上述代码中,writeObject
方法将对象进行序列化,flush
方法将缓存数据写入磁盘,close
方法关闭输出流。序列化后的对象将保存在file.txt
文件中。
反序列化
将Java对象进行反序列化,需要执行下面两个步骤:
- 调用ObjectInputStream类实现反序列化
使用ObjectInputStream类方便的可以将序列化后的数据转换成Java对象,使用该类进行反序列化的基本步骤如下:
InputStream inputStream = new FileInputStream("file.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Object object = objectInputStream.readObject();
objectInputStream.close();
上述代码中,readObject
方法将从文件中读取序列化后的数据,并将其转换成Java对象返回,close
方法关闭输入流。反序列化的对象为object
。
- 反序列化后需要进行强制类型转换
因为反序列化后得到的对象是Object类型,所以需要将其强制转换成原先的数据类型,示例代码如下:
Student student = (Student) object;
示例
下面我们来看两个示例:
示例一
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
// 定义Student类
class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void display() {
System.out.println("name:" + name + ", age:" + age);
}
}
public class SerializeDemo {
public static void main(String[] args) throws Exception {
Student student = new Student("Tom", 18);
// 序列化
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("student.txt"));
objectOutputStream.writeObject(student);
objectOutputStream.flush();
objectOutputStream.close();
// 反序列化
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("student.txt"));
Student s = (Student) objectInputStream.readObject();
s.display();
objectInputStream.close();
}
}
代码解析:
该例子定义了一个Student类,实现了Serializable接口,通过定义display
方法,来展示反序列化后的数据。
该例子通过ObjectOutputStream类实现了序列化,将Student对象序列化并保存到文件中,通过ObjectInputStream类实现了反序列化,从文件中读取序列化的数据并将其转换为Student对象。
示例二
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
// 定义Student类
class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public void display() {
System.out.println("name:" + name + ", age:" + age);
}
}
public class SerializeDemo {
public static void main(String[] args) throws Exception {
Student student = new Student("Tom", 18);
// 序列化
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(student);
objectOutputStream.flush();
objectOutputStream.close();
// 反序列化
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
Student s = (Student) objectInputStream.readObject();
s.display();
objectInputStream.close();
}
}
代码解析:
该例子同样定义了一个Student类,实现了Serializable接口,通过定义display
方法,来展示反序列化后的数据。
该例子通过ByteArrayOutputStream类实现了序列化,将Student对象序列化并保存到内存中,通过ByteArrayInputStream类实现了反序列化,从内存中读取序列化的数据并将其转换为Student对象。
至此,Java对象的序列化和反序列化的攻略已经介绍完毕。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java对象的序列化和反序列化 - Python技术站