Java序列化是指将一个Java对象转换为字节流,便于在网络传输和存储中使用。序列化后,该字节流可以被传输到不同的机器上,同时可以被存储到文件或数据库中。Java序列化是Java语言中一个常用的功能。
序列化和反序列化的概念
Java序列化由两个重要的概念组成:序列化和反序列化。序列化是将Java对象转换成字节流,而反序列化则是将字节流转换为Java对象。序列化允许我们在不失去对象属性的前提下,传输或存储对象,将对象在不同机器之间的传输和存储变得更加方便。
如何进行Java序列化
Java序列化可以通过以下步骤进行:
步骤1:实现Serializable接口
要使Java对象能够被序列化,Java类必须实现Serializable接口。这个接口里没有任何需要实现的方法,只是作为一个标记接口来标识该类是可序列化的。
以下是一个例子:
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
//...构造函数和Getter/Setter方法
}
在上面的例子中,我们实现了Serializable接口,自定义了一个Person类,并且声明了两个私有属性,name和age。
步骤2:创建ObjectOutputStream和FileOutputStream对象
要将Java对象序列化到文件中,您需要创建ObjectOutputStream对象,并将其连接到一个FileOutputStream。为此,您需要传递一个文件名作为参数来创建FileOutputStream对象,并将它传递给ObjectOutputStream构造函数。
以下是一个例子:
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializeDemo {
public static void main(String[] args) {
Person person = new Person("Tom", 30);
try {
FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(person);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in person.ser");
} catch (Exception e) {
e.printStackTrace();
}
}
}
在上面的代码中,我们创建了一个名为“person.ser”的文件并将其用于存储序列化数据。我们创建了一个Person对象,将其序列化到了该文件中。要实现这个,我们使用了“FileOutputStream”和“ObjectOutputStream”类。
步骤3:创建ObjectInputStream和FileInputStream对象
反序列化一个Java对象也需要一些步骤。在Java中,我们需要创建一个ObjectInputStream对象,并连接它到FileInputStream对象。为此,我们需要传递一个文件名作为参数来创建FileInputStream对象,并将其传递给ObjectInputStream构造函数以创建ObjectInputStream对象。
以下是一个例子:
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class DeserializeDemo {
public static void main(String[] args) {
Person person = null;
try {
FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
person = (Person) in.readObject();
in.close();
fileIn.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Deserialized Person...");
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
}
}
在上面的代码中,我们首先创建了一个名为“person.ser”的文件来存储序列化数据。我们反序列化了该文件中的对象,并将其打印出来。要实现这一点,我们使用了FileInputStream和ObjectInputStream类。
两条示例说明
下面给出两个关于Java序列化的代码示例:
示例1:将Java对象序列化到文件中
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializeDemo {
public static void main(String[] args) {
Person person = new Person("Tom", 30);
try {
FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(person);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in person.ser");
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
在上面的例子中,我们创建了一个Person对象,将其序列化到了名为“person.ser”的文件中。然后,我们关闭ObjectOutputStream和FileOutputStream。
示例2:从文件中反序列化Java对象
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class DeserializeDemo {
public static void main(String[] args) {
Person person = null;
try {
FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
person = (Person) in.readObject();
in.close();
fileIn.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Deserialized Person...");
System.out.println("Name: " + person.getName());
System.out.println("Age: " + person.getAge());
}
}
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
在上面的例子中,我们读取了名为“person.ser”的文件,并将其反序列化成一个Person对象。我们将该对象的属性打印出来。我们关闭ObjectInputStream和FileInputStream。