原文: https://beginnersbook.com/2014/07/java-serialization/

在这里,我们将讨论如何序列化和反序列化对象以及它的用途。

什么是 Java 序列化?

序列化是一种将对象转换为字节流的机制,以便可以将其写入文件,通过网络传输或存储到数据库中。反序列化反之亦然。简单来说,序列化是将对象转换为字节流,反序列化是从字节流重建对象。 Java 序列化 API 执行序列化和反序列化。类必须实现java.io.Serializable接口才有资格进行序列化。

让我们举个例子来更好地理解这些概念:

示例

此类实现Serializable接口,这意味着它可以被序列化。除了那些声明为transient的字段外,该类的所有字段都可以在转换为字节流后写入文件。在下面的示例中,我们有两个瞬态字段,这些字段不参与序列化。

Student.java

  1. public class Student implements java.io.Serializable{
  2. private int stuRollNum;
  3. private int stuAge;
  4. private String stuName;
  5. private transient String stuAddress;
  6. private transient int stuHeight;
  7. public Student(int roll, int age, String name,
  8. String address, int height) {
  9. this.stuRollNum = roll;
  10. this.stuAge = age;
  11. this.stuName = name;
  12. this.stuAddress = address;
  13. this.stuHeight = height;
  14. }
  15. public int getStuRollNum() {
  16. return stuRollNum;
  17. }
  18. public void setStuRollNum(int stuRollNum) {
  19. this.stuRollNum = stuRollNum;
  20. }
  21. public int getStuAge() {
  22. return stuAge;
  23. }
  24. public void setStuAge(int stuAge) {
  25. this.stuAge = stuAge;
  26. }
  27. public String getStuName() {
  28. return stuName;
  29. }
  30. public void setStuName(String stuName) {
  31. this.stuName = stuName;
  32. }
  33. public String getStuAddress() {
  34. return stuAddress;
  35. }
  36. public void setStuAddress(String stuAddress) {
  37. this.stuAddress = stuAddress;
  38. }
  39. public int getStuHeight() {
  40. return stuHeight;
  41. }
  42. public void setStuHeight(int stuHeight) {
  43. this.stuHeight = stuHeight;
  44. }
  45. }

对象的序列化

该类正在将Student类的对象写入Student.ser文件。我们使用FileOutputStreamObjectOutputStream将对象写入File

注意:根据 Java 序列化的最佳实践,文件名应具有.ser扩展名。

  1. import java.io.FileOutputStream;
  2. import java.io.ObjectOutputStream;
  3. import java.io.IOException;
  4. public class SendClass
  5. {
  6. public static void main(String args[])
  7. {
  8. Student obj = new Student(101, 25, "Chaitanya", "Agra", 6);
  9. try{
  10. FileOutputStream fos = new FileOutputStream("Student.ser");
  11. ObjectOutputStream oos = new ObjectOutputStream(fos);
  12. oos.writeObject(obj);
  13. oos.close();
  14. fos.close();
  15. System.out.println("Serialzation Done!!");
  16. }catch(IOException ioe){
  17. System.out.println(ioe);
  18. }
  19. }
  20. }

输出:

  1. Serialzation Done!!

对象的反序列化

从读取文件中的字节流后,该类将重建Student类的对象。观察此课程的输出,学生地址和学生身高字段为null和 0。这是因为这些字段在Student类中被声明为transient

  1. import java.io.FileInputStream;
  2. import java.io.ObjectInputStream;
  3. import java.io.IOException;
  4. public class AcceptClass {
  5. public static void main(String args[])
  6. {
  7. Student o=null;
  8. try{
  9. FileInputStream fis = new FileInputStream("Student.ser");
  10. ObjectInputStream ois = new ObjectInputStream(fis);
  11. o = (Student)ois.readObject();
  12. ois.close();
  13. fis.close();
  14. }
  15. catch(IOException ioe)
  16. {
  17. ioe.printStackTrace();
  18. return;
  19. }catch(ClassNotFoundException cnfe)
  20. {
  21. System.out.println("Student Class is not found.");
  22. cnfe.printStackTrace();
  23. return;
  24. }
  25. System.out.println("Student Name:"+o.getStuName());
  26. System.out.println("Student Age:"+o.getStuAge());
  27. System.out.println("Student Roll No:"+o.getStuRollNum());
  28. System.out.println("Student Address:"+o.getStuAddress());
  29. System.out.println("Student Height:"+o.getStuHeight());
  30. }
  31. }

输出:

  1. Student Name:Chaitanya
  2. Student Age:25
  3. Student Roll No:101
  4. Student Address:null
  5. Student Height:0