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

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

自定义类只要实现了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属性。对用户类进行序列化和反序列化,并且不保存用户的年龄。

代码示例:

 import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable; class Address implements Serializable{
private static final long serialVersionUID = 1L;
int id;
String detailAddress;
public Address(int id, String detailAddress) {
this.id = id;
this.detailAddress = detailAddress;
}
@Override
public String toString() {
return "地址信息: id"+this.id + "详细地址:"+this.detailAddress;
}
} class User implements Serializable{
private static final long serialVersionUID = 1L;
int id;
String name;
Address address;
transient int age;
public User(int id, String name, Address address, int age) {
this.id = id;
this.name = name;
this.address = address;
this.age = age;
}
@Override
public String toString() {
return "用户信息: 用户id:"+ this.id+"用户名:"+this.name +" 年龄"+this.age + this.address;
}
} public class DemoObjectStream {
public static void main(String[] args) throws IOException, ClassNotFoundException { //序列化
User user = new User(123, "张三", new Address(110, "公安局"), 12);
FileOutputStream fileOutputStream = new FileOutputStream("E:\\nick.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(user);
objectOutputStream.close();
//反序列化
FileInputStream fileInputStream = new FileInputStream("E:\\nick.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
User user2 = (User)objectInputStream.readObject();
System.out.println(user2);
objectInputStream.close();
}
}

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

  1. Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)

    Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...

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

    序列化的基本操作 1.对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化. 2.序列化流(ObjectOutputStream),writeObject 方法用于将对象写入输出流中 ...

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

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

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

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

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

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

  6. 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转

    线程安全使用(四)   这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationT ...

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

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

  8. Java IO(Properties/对象序列化/打印流/commons-io)

    Java IO(Properties/对象序列化/打印流/commons-io) Properties Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载. ...

  9. JAVA RPC (四) 之thrift序列化普通对象

    先简单写一个thrift文件 本地通过thrift编译之后会生成一个java源文件.------编译口令 :thrift -gen java mytestrequest.thrift 编译后的源代码如 ...

随机推荐

  1. 12、ASP.NET MVC入门到精通——HtmlHelper

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 HtmlHelper:是为了方便View的开发而产生 HtmlHelper的演变 普通首页超级链接为:<a href="/h ...

  2. Redis常用五大数据类型

    1.String(字符串) string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 . string类型是Redis最基本的数据类型,一个red ...

  3. WindowsAPI调用和OCR图片识别

    傻了吧唧的装双系统.成功的干崩了原本的系统.现在重装VS.闲的没事胡扯几句. WindowsAPI在每一台Windows系统上开放标准API供开发人员调用.功能齐全.在这里只介绍三个部分. 1.利用A ...

  4. asp.net mvc 中 一种简单的 URL 重写

    asp.net mvc 中 一种简单的 URL 重写 Intro 在项目中想增加一个公告的功能,但是又不想直接用默认带的那种路由,感觉好low逼,想弄成那种伪静态化的路由 (别问我为什么不直接静态化, ...

  5. ArcGIS安装错误1402

    以前出遇到过在安装ArcGIS软件的时候出现1402错误,错误原因是因为权限不足,具体是什么造成权限不足还不清楚,估计是安装了什么软件后造成. 错误信息 解决方法 找到相应的注册表,在项上右键设置权限 ...

  6. 从tabBarController的一个item上的控制器跳转到另一个item上的控制器

    先从习惯性的tabBarController开始,很多应用的外框都是用这个开始的,而从tabBarController的一个item上的控制器跳转到另一个上的,往往都是直接通过点击tabBar上的不同 ...

  7. web.xml中监听器配置

    <!-- 监听器的配置:监听器配置完以后,应用系统在启动的时候就会开启这些监听器. 监听器的理解:监听器好比一个卫兵,卫兵一直站在那里等待长官的命令,当卫兵收到长官的命令以后,立即执行 之前已经 ...

  8. ORACLE使用GV_$TEMP_SPACE_HEADER统计临时表空使用情况不准确的问题

    以前写了一篇ORACLE临时表空间总结的文章, 里面介绍了几个查看临时表空间使用情况的脚本,其中一个脚本如下所示: SELECT TU.TABLESPACE_NAME                  ...

  9. 使用SQL Server 扩展事件来创建死锁的时间跟踪

    我们通过SQL Server 2012图形界面来部署一个扩展事件跟踪会话.然后可以生成SQL脚本,在2008或2008 R2版本下运行类似的跟踪. 步骤1: 通过“Object Explorer”连接 ...

  10. .NET应用架构设计—用户端的防腐层作用及设计

    阅读目录: 1.背景介绍 2.SOA架构下的显示端架构腐化 3.有效使用防腐层来隔离碎片服务导致显示端逻辑腐烂 4.剥离服务调用的技术组件让其依赖接口 5.将服务的DTO与显示端的ViewModel之 ...