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

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

自定义类只要实现了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. 移动页面div居中效果代码

    在线查看效果:http://hovertree.com/texiao/mobile/4.htm 可用手机浏览器查看 以下为HTML文件: <!DOCTYPE html> <html& ...

  2. CSS3文本溢出显示省略号

    CCS3属性之text-overflow:ellipsis;的用法和注意之处 语法: text-overflow:clip | ellipsis 默认值:clip 适用于:所有元素 clip: 当对象 ...

  3. Bootstrap之字体图标

    优点:1.减少请求 2.容易控制样式 所在位置:在下载的bootstrap文件中的fonts文件夹存放字体图标 默认路径为当前目录下,如需修改路径,则需在bootstrap.css中查找font-fa ...

  4. Web AppBuilder Widget使用共享类库的方式

    Web AppBuilder是Esri公司推出的快速WebGIS应用搭建工具,具有以下特性: 不需要编程,快速创建应用 WYSIWYG 交互式应用 支持2D和3D应用 基于ArcGIS API for ...

  5. Linux0.11内核--进程调度分析之2.调度

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5596830.html ] 上一篇说到进程调度归根结底是调用timer_interrupt函数, ...

  6. 2016年4月21百度iOS实习生在线笔试题&编程题

    1.一个人上台阶可以一次上1个,2个,或者3个,问这个人上32层的台阶,总共有几种走法? 思路:先建立数学模型,设3步的走 i 次,2步的走 j 次, 1步的走 k 次,上了3*i + 2*j + 1 ...

  7. Python之Mac上搭建集成开发环境

    首先下载一个东西: 找到下载地址:https://download.jetbrains.8686c.com/python/pycharm-professional-2016.2.1.dmg pycha ...

  8. C#和ASP.NET之事件

    事件是一种用于类和类之间传递消息或触发新的行为的编程方式.通过提供事件的句柄,能够把控件和可执行的代码联系在一起, 如用户单击Button控件触发Click事件后就执行相应的事件处理代码. 事件的声明 ...

  9. MySQL如何导出带日期格式的文件

    一网友问在MySQL中如何只用SQL语句导出带日期格式的文件.觉得有点意思,于是尝试了一下.导出文件使用SELECT INTO OUTFILE 但是OUTFILE后面的值不能使用变量,所以只能使用动态 ...

  10. SQL Server 查询树结构的表,查询一个节点的所有子节点

    ;with cte as ( select * from Associator where No = 'mc1007' union all select air.* from Associator a ...