I/O流、序列化
1)流序列化对象ObjectOutputStream调用writerObject写出序列化对象,ObjectInputStream调用readObject读取序列化对象,序列化的对象必须要实现Serializable接口,该接口没有任何需要待实现的方法,只需继承即可。序列化之前的对象和序列化之后的对象是两个不同的对象,两者不是相等的。
序列化代码样例:
- //写出序列化
- String path="G:\\obj.txt";
- ObjectOutputStream stream=new ObjectOutputStream(new FileOutputStream(path));
- stream.writeObject(student);
- stream.close();
- // 读取序列化
- ObjectInputStream inputStream=new ObjectInputStream(new FileInputStream(path));
- Student student2=(Student)inputStream.readObject();
- inputStream.close();
在序列化过程中,某些域(属性)不想被序列化,可以使用transient标记不被序列化(方法不适用transient),不可序列化的类作为一个属性表示的话一定要加上transient不然会报NotSerializableException。
例子:
- private transient String _date;
方法标记transient报错 必须去掉transient标记。
2)使用Externalizable接口可以定制自己的序列化机制,此接口有两个公开的可重写的方法readExternal和writeExternal
代码样例:
- public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
- // TODO 自动生成的方法存根
- ExternalDemo demo = new ExternalDemo();
- demo.setName("zhangsan");
- ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
- Paths.get("G:\\", "ExternalDemo.dat").toFile()));
- demo.writeExternal(out);
- ObjectInputStream in = new ObjectInputStream(new FileInputStream(Paths
- .get("G:\\", "ExternalDemo.dat").toFile()));
- demo.readExternal(in);
- System.out.println(demo.getName());
- }
- public class ExternalDemo implements Externalizable {
- private String _name;
- public String getName() {
- return _name;
- }
- public void setName(String name) {
- _name = name;
- }
- @Override
- public void readExternal(ObjectInput in) throws IOException,
- ClassNotFoundException {
- // TODO 自动生成的方法存根
- _name = (String) in.readObject();
- }
- @Override
- public void writeExternal(ObjectOutput out) throws IOException {
- // TODO 自动生成的方法存根
- out.writeObject(_name);
- }
- }
3)序列化单例和类型安全的枚举
上面已介绍过普通的序列化写出和读取的对象是两个不同的对象,而对于单例来说要求写出和读取的对象是同一个对象,这就需要写一个方法来实现readResolve()。举一个例子来说明:
- public class Orientation implements Serializable {
- private int value;
- private Orientation(int v) {
- value = v;
- }
- public static final Orientation HORIZONTAL = new Orientation(1);
- public static final Orientation VERTICAL = new Orientation(2);
- protected Orientation readResolve() {
- if (value==1) {
- return Orientation.HORIZONTAL;
- }
- else if (value==2) {
- return Orientation.VERTICAL;
- }
- else {
- return null;
- }
- }
- }
- public static void main(String[] args) {
- try {
- // 待序列化的对象
- Orientation horizontal = Orientation.HORIZONTAL;
- // 序列化
- FileOutputStream fileOutputStream = new FileOutputStream(new File(
- "G:\\orientation.dat"));
- ObjectOutputStream outputStream = new ObjectOutputStream(
- fileOutputStream);
- outputStream.writeObject(horizontal);
- outputStream.close();
- fileOutputStream.close();
- // 反序列化
- ObjectInputStream inputStream = new ObjectInputStream(
- new FileInputStream(new File("G:\\orientation.dat")));
- Orientation horiOrientation = ((Orientation) inputStream
- .readObject()).readResolve();
- inputStream.close();
- // 校验序列化前后的对象是否一致
- System.out.println(horiOrientation == horizontal);
- } catch (Exception exception) {
- }
- }
第一段代码中我们定义了一个私有变量value和两个静态对象HORIZONTAL,VERTICAL,当我们要序列化对象HORIZONTAL,其value=1,再次反序列化时,如果只调用inputStream的readObject方法,将返回一个新的Orientation对象;如果调用了readResolve方法,将返回序列化之前的对象HORIZONTAL,这是因为调用readResolve方法时会去校验value的值,根据其值返回对象。
I/O流、序列化的更多相关文章
- [.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化
[.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化 本节导读: 在.NET编程中,经常面向对象处理完以后要转换成另一种格式传输或存储,这种将对 ...
- IO流--序列化流与反序列化流
IO流--序列化流与反序列化流: 序列化流:把对象当做流一样写入到文本文件中 ObjectOutputSream(); 反序列化流:把文本文件中的流对象还原成对象ObjectInputSream(): ...
- Java IO流-序列化流和反序列化流
2017-11-05 20:42:06 序列化流:把对象按照流的方式存入文本文件或者在网络中传输. 对象 -- 流数据(ObjectOutputStream) 反序列化流:把文本文件中的流对象数据或者 ...
- 文件I/O:文件流→序列化
★文件流 文件操作是最简单最直接也是最容易想到的一种方式,我们说的文件操作不仅仅是通过FileInputStream/FileOutputStream这么“裸”的方式直接把数据写入到本地文件(像我以前 ...
- Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类
一.Properties 类(java.util) 概述:Properties 是一个双列集合;Properties 属于map的特殊的孙子类;Properties 类没有泛型,propert ...
- 16 IO流(十三)——Object流 序列化与反序列化
Object流.序列化与反序列化 Object流是将 可序列化的对象 进行序列化与反序列化的流. 可序列化的对象:使用关键字Serializable修饰,表示这个对象可以进行序列化与反序列化. 序列化 ...
- IO异常--缓冲流--转换流--序列化流( IO流2 )
1.IO异常的处理 JDK7前处理:使用try...catch...finally 代码块,处理异常部分 // 声明变量 FileWriter fw = null; try { //创建流对象 fw ...
- NET中级课--文件,流,序列化3
1.序列化:将对象及状态保存起来. 反序列化就是逆操作. 2.NET提供了一个接口:System.runtime.serialization.IFormatter接口, 还有实现了这个接口的类Bina ...
- NET中级课--文件,流,序列化2
1.流的类型体系: 基础流 装饰器流 包装器类 帮助类 2. stream file~ memory~ network~ stream是个 ...
- NET中级课--文件,流,序列化1
1.对于机器的角度来看,任何文件都是二进制的0和1. 2. 位:bit,一个1或0就是1位. 字节:byte,每8位一个字节.一个字节的范围就是00000000到1111111,换成10进制就是0 ...
随机推荐
- Java开发中代码规范有哪些?
Java开发中所要遵守的编码规范大体上有如下7点.命名规范.注释规范.缩进排版规范.文件名规范.声明规范.语句规范以及编程规范. 1.命名规范 (1)所有的标示符都只能用ASCⅡ字母(A-Z或a-z) ...
- 获取select下拉框的value以及文本内容
select下拉框在项目开发中是经常用到的,特别是在联级菜单方面的应用更为广泛.但是,对于一些初学者来说,如何获取下拉框子节点option的value值和文本内容,还是有一点难度的.其他的就不说了,现 ...
- IOS开发入门实例
关于如何创建第一个 iOS 应用 本篇“第一个 iOS 应用”教程将向你介绍 iOS 应用开发中的“三个T”: Tools(工具)如何利用 Xcode 创建和管理工程. Technologies(技术 ...
- #学习笔记#e2e学习使用(一)
本文仅限于记录本人学习的过程,以及怎么踩的坑,是如何解决的.逻辑肯定是混乱的,有用之处会抽出共通另行发帖. 最终目标:要运用于Vue项目中,进行功能测试甚至自动化测试. 一.e2e概念 理解:end ...
- Git软件的学习
第一部分:我的git地址是https://github.com/ZHU19007/gitLearning 第二部分:我对git的认识 一.Git是一款免费.开源的分布式版本控制工具.而Github是用 ...
- c++利用互斥锁实现读写锁
很简单就是在读的时候把写的锁锁住就好了 class readwrite_lock { public: readwrite_lock() : read_cnt(0) { } void readLock( ...
- VI编辑器查找替换
1.Vi下进行查找 VI命令模式下:输入“/要查找的词”回车就会进入查找,你可以按“n”查找下一个,按“N”查找上一个.类似查找命令“?”与“/”的区别是“/”为向下查找,“?”为向上查找. 2.Vi ...
- VirtualBox改变虚拟硬盘位置
原本放虚拟硬盘的位置容量不足,因此将原来的虚拟硬盘放到了一个相对空闲的分区.设置虚拟硬盘位置时出现一点小问题,解决过程记录如下. 1. 将虚拟硬盘复制到目标位置后,假设为“F:\Ubuntu 16.0 ...
- 【洛谷P1726】上白泽慧音
上白泽慧音 题目链接 强联通分量模板题,Tarjan求强联通分量,记录大小即可 #include<iostream> #include<cstring> #include< ...
- 【luogu P3371 单源最短路径】 模板 dij + heap
题目链接:https://www.luogu.org/problemnew/show/P3371#sub 堆优化迪杰斯特拉,留着以后复习用 #include <iostream> #inc ...