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、读方法

ObjectreadObject() 从 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 }

时间: 2024-07-29 10:05:44

IO(四)----对象的序列化的相关文章

Java—IO流 对象的序列化和反序列化

序列化的基本操作 1.对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化. 2.序列化流(ObjectOutputStream),writeObject 方法用于将对象写入输出流中: 反序列化流(ObjectInputStream),readObject 方法用于从输入流中读取对象. 3.序列化接口(Serializeable) 对象必须实现序列化接口,才能进行序列化,否则会出现异常.这个接口没有任何方法,只是一个标准. package com.test.io; import

JAVA之旅(三十)——打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码

JAVA之旅(三十)--打印流PrintWriter,合并流,切割文件并且合并,对象的序列化Serializable,管道流,RandomAccessFile,IO其他类,字符编码 三十篇了,又是一个阳光明媚的周末,一个又一个的周末,周而复始,不断学习,前方的路你可曾看见?随我一起走进技术的世界,流连忘返吧! 一.打印流PrintWriter 打印流有PrintWriter和PrintStream,他的特点可以直接操作输入流还有文件 该流提供了打印方法,可以将各种数据类型原样打印 file对象

对象的序列化与反序列化---IO学习笔记(四)

对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流.反序列化流 序列化流(ObjectOutputStream),是字节的过滤流->主要方法:writeObject() 反序列化流(ObjectInputStream)->主要方法:readObject() 序列化接口(Serializable) 对象必须实现序列化接口.才干进行序列化.否则将出现异常 这个接口,没有不论什么方法,仅仅是一个标准. 主要的对象

java中的对象的序列化与反序列化的知识点---IO学习笔记(四)

对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流,反序列化流 序列化流(ObjectOutputStream),是字节的过滤流->主要方法:writeObject() 反序列化流(ObjectInputStream)->主要方法:readObject() 序列化接口(Serializable) 对象必须实现序列化接口,才能进行序列化,否则将出现异常 这个接口,没有任何方法,只是一个标准. 基本的对象序列化

java核心学习(十七) IO框架---对象序列化

一.使用对象流实现序列化. 先定义一个可序列化的对象 package com.shy.IO; import java.io.Serializable; public class Person implements Serializable{ public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } publ

JAVA学习第五十六课 — IO流(十)对象的序列化和反序列化 & RandomAccessFile

操作对象 ObjectInputStream.ObjectOutputStream 被操作的对象需要实现Serializable(标记接口) ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInputStream 读取(重构)对象.通过在流中使用文件可以实现对象的持久存储.如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象. 对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的

IO流 (对象的序列化)

package com.yyq; import java.io.*; //Serializable 接口没有 ((标记接口 ) // 对象的序列化: 都有一个ID标识: 通常是被编译器识别的 // 对象被序列化,我们无需看的懂,这样的话对象就存起来了 // 可以提供对象和对象的值: 已经封装好了值,不需要自己在创建了 // 类不能被修改 ,当类被修改后会产生无效的类异常 // 可以自定义序列号 (序列号UID 本身是自动生成的) // UID 给类加一个固定标记 // 序列号: 是根据成员计算得

Java对象的序列化和反序列化

一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中: 2) 在网络上传送对象的字节序列. 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些s

对象的序列化以及反序列

一:需求分析 在实际的B/S结构中,对象的序列化和反序列化很重要,尤其是请求量比较大的情况,服务器压力很大, 会把一部分session序列化,然后保存到硬盘中. 二:定义DTO对象 定义的实体类一定要实现 Serializable接口,才可以序列化. 1 /** 2 * 3 */ 4 package com.hlcui.dto; 5 6 import java.io.Serializable; 7 8 /** 9 * @author Administrator 学生实体类 10 */ 11 pu