Java对象序列化是Java库堆栈提供的一种API,用于序列化Java对象。序列化是将对象转换为可写字节流的过程。一旦转换为字节流,就可以将这些对象写入文件。反向过程称为反序列化。
如果Java对象的类或其任何超类实现java.io.Serializable
接口或其子接口java.io.Externalizable
,则该对象是可序列化的。
Person.java
package com.mkyong; import java.io.Serializable; public class Person implements Serializable { private static final long serialVersionUID = 1L; private String name; private int age; private String gender; Person() { }; Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } @Override public String toString() { return "Name:" + name + "\nAge: " + age + "\nGender: " + gender; } }
2.用Java编写和读取对象
可以使用java.io.ObjectOutputStream
将对象转换为字节流。为了能够使用ObjectOutputStream
将对象写入文件,必须使相关类实现Serializable
接口,如下面的类定义所示。用Java读取对象类似于使用ObjectOutputStreamObjectInputStream
写入对象。下面的示例显示了用Java编写对象和读取对象的完整周期。在读取对象时, ObjectInputStream
直接尝试将所有属性映射到我们尝试将读取对象转换为的类中。如果无法准确地映射相应的对象,则将引发ClassNotFound
异常。现在让我们使用一个示例来了解写作和阅读过程。我们将上面显示的Person
类用作对象。
WriterReader.java
package com.mkyong; package com.mkyong; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class WriterReader { public static void main(String[] args) { Person p1 = new Person("John", 30, "Male"); Person p2 = new Person("Rachel", 25, "Female"); try { FileOutputStream f = new FileOutputStream(new File("myObjects.txt")); ObjectOutputStream o = new ObjectOutputStream(f); // Write objects to file o.writeObject(p1); o.writeObject(p2); o.close(); f.close(); FileInputStream fi = new FileInputStream(new File("myObjects.txt")); ObjectInputStream oi = new ObjectInputStream(fi); // Read objects Person pr1 = (Person) oi.readObject(); Person pr2 = (Person) oi.readObject(); System.out.println(pr1.toString()); System.out.println(pr2.toString()); oi.close(); fi.close(); } catch (FileNotFoundException e) { System.out.println("File not found"); } catch (IOException e) { System.out.println("Error initializing stream"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
执行上面的代码后,我们得到以下输出:
Name:John Age: 30 Gender: Male Name:Rachel Age: 25 Gender: Female
原文:https://www.cnblogs.com/summerxbc/p/13860477.html