Dev_Nick

导航

IO(四)----对象的序列化

对象的序列化:   将内存中的对象直接写入到文件设备中。

对象的反序列化: 将文件设备中持久化的数据转换为内存对象。

自定义类只要实现了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、读方法

Object readObject() 从 ObjectInputStream 读取对象。

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 }
View Code

 

posted on 2017-01-05 17:04  Dev_Nick  阅读(112)  评论(0编辑  收藏  举报