对象的序列化: 将内存中的对象直接写入到文件设备中。
对象的反序列化: 将文件设备中持久化的数据转换为内存对象。
自定义类只要实现了Serializable接口,便可以通过对象输入输出流对对象进行序列化和反序列化。从而来实现对象的持久化存储。
对象的输入输出流 : 对象的输入输出流 主要的作用是用于写对象的信息与读取对象的信息。
对象信息一旦写到文件上那么对象的信息就可以做到持久化存储了。
对象的输出流: ObjectOutputStream
常用方法:
1、构造方法
ObjectOutputStream(OutputStream out)
创建写入指定 OutputStream 的 ObjectOutputStream。
2、写方法
void writeObject(Object obj)
将指定的对象写入 ObjectOutputStream。
3、关闭资源方法
void close()
关闭流。
对象的输入流: ObjectInputStream
1、构造方法
ObjectInputStream(InputStream in)
创建从指定 InputStream 读取的 ObjectInputStream。
2、读方法
从 ObjectInputStream 读取对象。 Object
readObject()
3、关闭资源方法
void close()
关闭流。
对象输入输出流要注意的细节:
1. 如果对象需要被写出到文件上,那么对象所属的类必须要实现Serializable接口。 Serializable接口没有任何的方法,是一个标识接口而已。
2. 对象的反序列化创建对象的时候并不会调用到构造方法的。
3. serialVersionUID 是用于记录class文件的版本信息的,serialVersionUID这个数字是通过一个类的类名、成员、包名、工程名算出的一个数字。
4. 使用ObjectInputStream反序列化的时候,ObjeectInputStream会先读取文件中的serialVersionUID,然后与本地的class文件的serialVersionUID进行对比,如果这两个id不一致,那么反序列化就失败了。
5. 如果序列化与反序列化的时候可能会修改类的成员,那么最好一开始就给这个类指定一个serialVersionUID,如果一类已经指定的serialVersionUID,然后在序列化与反序列化的时候,jvm都不会再自己算这个 class的serialVersionUID了。
6. 如果一个对象某个数据不想被序列化到硬盘上,可以使用关键字transient修饰。
7. 如果一个类维护了另外一个类的引用,那么另外一个类也需要实现Serializable接口。
需求:存在两个类:用户类和地址类。用户类中有id,name,address,age属性。对用户类进行序列化和反序列化,并且不保存用户的年龄。
代码示例:
1 import java.io.FileInputStream; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 import java.io.ObjectInputStream; 5 import java.io.ObjectOutputStream; 6 import java.io.Serializable; 7 8 class Address implements Serializable{ 9 private static final long serialVersionUID = 1L; 10 int id; 11 String detailAddress; 12 public Address(int id, String detailAddress) { 13 this.id = id; 14 this.detailAddress = detailAddress; 15 } 16 @Override 17 public String toString() { 18 return "地址信息: id"+this.id + "详细地址:"+this.detailAddress; 19 } 20 } 21 22 class User implements Serializable{ 23 private static final long serialVersionUID = 1L; 24 int id; 25 String name; 26 Address address; 27 transient int age; 28 public User(int id, String name, Address address, int age) { 29 this.id = id; 30 this.name = name; 31 this.address = address; 32 this.age = age; 33 } 34 @Override 35 public String toString() { 36 return "用户信息: 用户id:"+ this.id+"用户名:"+this.name +" 年龄"+this.age + this.address; 37 } 38 } 39 40 public class DemoObjectStream { 41 public static void main(String[] args) throws IOException, ClassNotFoundException { 42 43 //序列化 44 User user = new User(123, "张三", new Address(110, "公安局"), 12); 45 FileOutputStream fileOutputStream = new FileOutputStream("E:\nick.txt"); 46 ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); 47 objectOutputStream.writeObject(user); 48 objectOutputStream.close(); 49 //反序列化 50 FileInputStream fileInputStream = new FileInputStream("E:\nick.txt"); 51 ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); 52 User user2 = (User)objectInputStream.readObject(); 53 System.out.println(user2); 54 objectInputStream.close(); 55 } 56 }