当创建对象时,程序运行时它就会存在,但是程序停止时,对象也就消失了.但是如果希望对象在程序不运行的情况下仍能存在并保存其信息,将会非常有用,对象将被重建并且拥有与程序上次运行时拥有的信息相同。可以使用对象的序列化。

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

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

基本的序列化由两个方法产生:一个方法用于序列化对象并将它们写入一个流,另一个方法用于读取流并反序列化对象。

ObjectOutput

writeObject(Object obj)

将对象写入底层存储或流。

ObjectInput

readObject()

读取并返回对象。

下面介绍的就是他们的实现子类:ObjectOutputStream和ObjectInputStream

对象的输入输出流:对象的输入输出流的主要作用是:用于对象信息的读写,对象信息一旦写到文件上那么对象的信息就可以持久化

对象的输出流

ObjectOutputStream 主要用用于输出对象

ObjectOutputStream的使用步骤

1、找到目标文件

2、建立数据的输出流通道,需要准备一个FileOutputStream流

3、建立对象的输出流通道

4、把对象写出去

5、关闭资源

使用反序列化,就是使用流ObjectInputStream流,完全和上面相反的步骤。

对象输入输出流使用需要注意的细节:

1、如果对象需要被写出到文件上,那么对象所属的类必须要实现Serializable接口,Serializable接口没有任何的方法,是一个标志接口。

2、对象的反序列化和对象的克隆,创建对象的时候,并不会调用构造方法。

3、serialVersionUID是用于记录class文件的版本信息的,serialVersionUID这个数字是通过一个类的类名,成员,包名,工程名算出来的一个数字。

4、使用ObjectInputStream反序列化的时候,ObjectInputStream会先读取文件中的serialVersionUID与本地的serialVersionUID对比,如果不一致反序列化失败

5、如果反序列化的时候可能会修改类的成员,那么最好一开始就给这个类,指定一个serialVersionUID,如果一个类已经指定了serialVersionUID,然后在序列化和反序列化的时候,jvm都不会自己计算这个class的serialVersionUID了。这样就不怕无法序列化和反序列化了。点击累前面的黄色箭头,添加一个serialVersionUID

6、如果一个对象的某个数据不想序列化到硬盘上,可以使用关键字transient修饰

7、如果一个类,维护了另外一个类的引用,另外一个类,也需要实现Serializable接口。如果无法修改这个类的源码,可以给这个类创建一个可序列化的子类。如果这个类是final的也就是不可以继承的。那么就在使用trancint关键字,或者是指定serialVersionUID。

下面是一个简单的例子:

 class Address implements Serializable
{
String country;
String city; public Address(String country, String city)
{
this.country = country;
this.city = city;
}
} class User implements Serializable{ private static final long serialVersionUID = -1241976087141510667L; String userName ; String password ; transient int age; Address address; public User(String name, String pass)
{
this.userName = name;
this.password = pass;
} public User(String name, String pass, int age, Address address)
{
this.userName = name;
this.password = pass;
this.age = age;
this.address = address;
} @Override
public String toString()
{
return "用户名:"+this.userName+" 密码:"+this.password+" 年龄:"+this.age+" 地址:"+this.address.city;
}
} public class Demo3
{
public static void main(String[] args) throws IOException, ClassNotFoundException
{
//把user的信息持久化
/*User user = new User("admin", "123");
System.out.println(user);
*/
writeObj();
readObj(); } //把文件中的对象信息取出来
public static void readObj() throws IOException, ClassNotFoundException
{
File file = new File("D:\\users.txt");
FileInputStream fileInputStream = new FileInputStream(file);
//建立对象的输入流对象
ObjectInputStream inputStream = new ObjectInputStream(fileInputStream);
//读取独对象信息
User user = (User) inputStream.readObject(); //创建对象坑定要依赖对象所属的class文件
System.out.println(user);
} //定义方法把对象的信息写到硬盘上------>对象的序列化
public static void writeObj() throws IOException
{
Address address = new Address("China", "Anhui");
User user = new User("admin", "", , address); //1、找到目标文件
File file= new File("D:\\users.txt");
//建立数据的输出流对象
FileOutputStream fileOutputStream = new FileOutputStream(file);
//建立对象的输出流对象
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
//把对象写出去
objectOutputStream.writeObject(user);//序列化house的内容 是给JVM看的 一般我们是看不懂的
//关闭资源
objectOutputStream.close();
} }

(21)IO流之对象的序列化和反序列化流ObjectOutputStream和ObjectInputStream的更多相关文章

  1. 【Java IO流】对象的序列化和反序列化

    对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...

  2. 第12讲-Java中的IO操作及对象的序列化与反序列化

    1.知识点 1.1.课程回顾 1.2.本章重点 1.2.1  io操作 1.2.2  对象的序列化与反序列化 2.具体内容 2.1.Java IO 2.1.1.什么是IO IO其实就是输入.输出 I ...

  3. Java——IO流 对象的序列化和反序列化流ObjectOutputStream和ObjectInputStream

    对象的输入输出流 : 主要的作用是用于写入对象信息与读取对象信息. 对象信息一旦写到文件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream 对象的输入流:  Ob ...

  4. 类的序列化和反序列化(ObjectOutputStream和ObjectInputStream)

    1.需要序列化的类 import java.io.Serializable; /** * 必须继承 Serializable 接口才能实现序列化 */ public class Employee im ...

  5. ObjectOutputStream和ObjectInputStream对对象进行序列化和反序列化

    1 Java序列化和反序列化简介 Java序列化是指把对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为java对象的过程. 我们把对象序列化成有序字节流,保存到本地磁盘或者Redis等 ...

  6. Java基础---Java---IO流-----对象的序列化、管道流、RandomAccessFile、数据类型的流对象DataStream、ByteArrayStream

    ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化. ObjectOutputStream 和 ObjectInputStream ...

  7. Java基础IO流(四)序列化与反序列化

    对象的序列化与反序列化: 对象的序列化,就是将Object转换成byte序列,反之叫对象的反序列化. 序列化流(ObjectOutInputStream),是过滤流 -------writeObjec ...

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

    对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流.反序列化流 序列化流(ObjectOutputStream) ...

  9. Java对象的序列化与反序列化

    序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...

随机推荐

  1. Go并发编程实践

    前言 并发编程一直是Golang区别与其他语言的很大优势,也是实际工作场景中经常遇到的.近日笔者在组内分享了我们常见的并发场景,及代码示例,以期望大家能在遇到相同场景下,能快速的想到解决方案,或者是拿 ...

  2. 详解googe Chrome浏览器(理论篇)

    开篇概述 1详解google Chrome浏览器,这个标题似乎抽象了一些,我想应该把它拆分成如下几个问题,也许会更加理解一些. 问题1:目前开发中,主选浏览器有Google Chrome,IE,Fir ...

  3. 安装Ubuntu时的硬盘分区

    根目录 大小:60G~100G(用来安装程序) 新分区的类型:主分区 新分区的位置:空间起始位置 用于:EXT4日志文件系统 挂载点:"/" 大小:4G 新分区的类型:逻辑分区 新 ...

  4. [html5] 学习笔记-改良的input元素种类

    在html5中,大幅度增加与改良了input元素的种类,可以简单的使用这些元素来实现之前需要JS脚本来实现的功能. 1.url类型.email类型.date类型.time类型.datetime类型.d ...

  5. Linux驱动技术(四) _异步通知技术

    异步通知的全称是"信号驱动的异步IO",通过"信号"的方式,放期望获取的资源可用时,驱动会主动通知指定的应用程序,和应用层的"信号"相对应, ...

  6. 完成OSS.Http底层HttpClient重构封装 支持标准库

    OSS.Http项目对于.Net Standard标准库的支持已经迁移完毕,OSS开源系列两个最底层的类库已经具备跨运行时支持的能力.由于OSS.Http类库是几年前我参照RestSharp的思路,完 ...

  7. 属性——AddComponentMenu

    字面理解:添加 组件选项菜单 分析:可能是添加一个脚本或者组件到一个物体上 验证: 新建一个脚本:AttributeTest 提示:添加一个组件菜单属性,允许你放一个脚本在Compoent菜单下,来代 ...

  8. 远程推送-----iOS

    前言 说一下我了解的推送 正文 APNs--------Apple Push Notification service 1 远程推送的大概流程及其原理 我们的设备联网时(无论是蜂窝联网还是Wi-Fi联 ...

  9. IP查询接口

    腾讯的: http://fw.qq.com/ipaddress直接返回本机的IP地址对应的地区新浪的:http://counter.sina.com.cn/ip?ip=IP地址返回Js数据,感觉不是很 ...

  10. C++虚表(V-Table)解析

    C++中的虚函数的作用主要是实现了多态,本人通过代码验证的方式了解虚表的结构及在多种继承方式下通过虚表访问子类函数.验证结果如下: 1)无虚函数覆盖的一般继承:可以通过子类的虚表访问父类的函数 2)虚 ...