1)流序列化对象ObjectOutputStream调用writerObject写出序列化对象,ObjectInputStream调用readObject读取序列化对象,序列化的对象必须要实现Serializable接口,该接口没有任何需要待实现的方法,只需继承即可。序列化之前的对象和序列化之后的对象是两个不同的对象,两者不是相等的。

序列化代码样例:

  1. //写出序列化
  2. String path="G:\\obj.txt";
  3. ObjectOutputStream stream=new ObjectOutputStream(new FileOutputStream(path));
  4. stream.writeObject(student);
  5. stream.close();
  6.  
  7. // 读取序列化
  8. ObjectInputStream inputStream=new ObjectInputStream(new FileInputStream(path));
  9. Student student2=(Student)inputStream.readObject();
  10. inputStream.close();

在序列化过程中,某些域(属性)不想被序列化,可以使用transient标记不被序列化(方法不适用transient),不可序列化的类作为一个属性表示的话一定要加上transient不然会报NotSerializableException。

例子:

  1. private transient String _date;

方法标记transient报错 必须去掉transient标记。

2)使用Externalizable接口可以定制自己的序列化机制,此接口有两个公开的可重写的方法readExternal和writeExternal

代码样例:

  1. public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
  2. // TODO 自动生成的方法存根
  3.  
  4. ExternalDemo demo = new ExternalDemo();
  5. demo.setName("zhangsan");
  6.  
  7. ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
  8. Paths.get("G:\\", "ExternalDemo.dat").toFile()));
  9. demo.writeExternal(out);
  10.  
  11. ObjectInputStream in = new ObjectInputStream(new FileInputStream(Paths
  12. .get("G:\\", "ExternalDemo.dat").toFile()));
  13. demo.readExternal(in);
  14. System.out.println(demo.getName());
  15.  
  16. }
  1. public class ExternalDemo implements Externalizable {
  2.  
  3. private String _name;
  4.  
  5. public String getName() {
  6. return _name;
  7. }
  8.  
  9. public void setName(String name) {
  10. _name = name;
  11. }
  12.  
  13. @Override
  14. public void readExternal(ObjectInput in) throws IOException,
  15. ClassNotFoundException {
  16. // TODO 自动生成的方法存根
  17. _name = (String) in.readObject();
  18. }
  19.  
  20. @Override
  21. public void writeExternal(ObjectOutput out) throws IOException {
  22. // TODO 自动生成的方法存根
  23. out.writeObject(_name);
  24. }
  25.  
  26. }

3)序列化单例和类型安全的枚举

上面已介绍过普通的序列化写出和读取的对象是两个不同的对象,而对于单例来说要求写出和读取的对象是同一个对象,这就需要写一个方法来实现readResolve()。举一个例子来说明:

  1. public class Orientation implements Serializable {
  2.  
  3. private int value;
  4.  
  5. private Orientation(int v) {
  6. value = v;
  7. }
  8.  
  9. public static final Orientation HORIZONTAL = new Orientation(1);
  10. public static final Orientation VERTICAL = new Orientation(2);
  11.  
  12. protected Orientation readResolve() {
  13. if (value==1) {
  14. return Orientation.HORIZONTAL;
  15. }
  16. else if (value==2) {
  17. return Orientation.VERTICAL;
  18. }
  19. else {
  20. return null;
  21. }
  22. }
  23.  
  24. }
  1. public static void main(String[] args) {
  2.  
  3. try {
  4.  
  5. // 待序列化的对象
  6. Orientation horizontal = Orientation.HORIZONTAL;
  7.  
  8. // 序列化
  9. FileOutputStream fileOutputStream = new FileOutputStream(new File(
  10. "G:\\orientation.dat"));
  11. ObjectOutputStream outputStream = new ObjectOutputStream(
  12. fileOutputStream);
  13. outputStream.writeObject(horizontal);
  14. outputStream.close();
  15. fileOutputStream.close();
  16.  
  17. // 反序列化
  18. ObjectInputStream inputStream = new ObjectInputStream(
  19. new FileInputStream(new File("G:\\orientation.dat")));
  20. Orientation horiOrientation = ((Orientation) inputStream
  21. .readObject()).readResolve();
  22. inputStream.close();
  23.  
  24. // 校验序列化前后的对象是否一致
  25. System.out.println(horiOrientation == horizontal);
  26.  
  27. } catch (Exception exception) {
  28.  
  29. }
  30. }

第一段代码中我们定义了一个私有变量value和两个静态对象HORIZONTAL,VERTICAL,当我们要序列化对象HORIZONTAL,其value=1,再次反序列化时,如果只调用inputStream的readObject方法,将返回一个新的Orientation对象;如果调用了readResolve方法,将返回序列化之前的对象HORIZONTAL,这是因为调用readResolve方法时会去校验value的值,根据其值返回对象。

I/O流、序列化的更多相关文章

  1. [.net 面向对象程序设计进阶] (9) 序列化(Serialization) (一) 二进制流序列化

    [.net 面向对象程序设计进阶]  (9)  序列化(Serialization) (一) 二进制流序列化 本节导读: 在.NET编程中,经常面向对象处理完以后要转换成另一种格式传输或存储,这种将对 ...

  2. IO流--序列化流与反序列化流

    IO流--序列化流与反序列化流: 序列化流:把对象当做流一样写入到文本文件中 ObjectOutputSream(); 反序列化流:把文本文件中的流对象还原成对象ObjectInputSream(): ...

  3. Java IO流-序列化流和反序列化流

    2017-11-05 20:42:06 序列化流:把对象按照流的方式存入文本文件或者在网络中传输. 对象 -- 流数据(ObjectOutputStream) 反序列化流:把文本文件中的流对象数据或者 ...

  4. 文件I/O:文件流→序列化

    ★文件流 文件操作是最简单最直接也是最容易想到的一种方式,我们说的文件操作不仅仅是通过FileInputStream/FileOutputStream这么“裸”的方式直接把数据写入到本地文件(像我以前 ...

  5. Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类

    一.Properties 类(java.util)     概述:Properties 是一个双列集合;Properties 属于map的特殊的孙子类;Properties 类没有泛型,propert ...

  6. 16 IO流(十三)——Object流 序列化与反序列化

    Object流.序列化与反序列化 Object流是将 可序列化的对象 进行序列化与反序列化的流. 可序列化的对象:使用关键字Serializable修饰,表示这个对象可以进行序列化与反序列化. 序列化 ...

  7. IO异常--缓冲流--转换流--序列化流( IO流2 )

    1.IO异常的处理 JDK7前处理:使用try...catch...finally 代码块,处理异常部分 // 声明变量 FileWriter fw = null; try { //创建流对象 fw ...

  8. NET中级课--文件,流,序列化3

    1.序列化:将对象及状态保存起来. 反序列化就是逆操作. 2.NET提供了一个接口:System.runtime.serialization.IFormatter接口, 还有实现了这个接口的类Bina ...

  9. NET中级课--文件,流,序列化2

    1.流的类型体系: 基础流    装饰器流    包装器类    帮助类 2.               stream file~     memory~     network~ stream是个 ...

  10. NET中级课--文件,流,序列化1

    1.对于机器的角度来看,任何文件都是二进制的0和1. 2.   位:bit,一个1或0就是1位. 字节:byte,每8位一个字节.一个字节的范围就是00000000到1111111,换成10进制就是0 ...

随机推荐

  1. Java开发中代码规范有哪些?

    Java开发中所要遵守的编码规范大体上有如下7点.命名规范.注释规范.缩进排版规范.文件名规范.声明规范.语句规范以及编程规范. 1.命名规范 (1)所有的标示符都只能用ASCⅡ字母(A-Z或a-z) ...

  2. 获取select下拉框的value以及文本内容

    select下拉框在项目开发中是经常用到的,特别是在联级菜单方面的应用更为广泛.但是,对于一些初学者来说,如何获取下拉框子节点option的value值和文本内容,还是有一点难度的.其他的就不说了,现 ...

  3. IOS开发入门实例

    关于如何创建第一个 iOS 应用 本篇“第一个 iOS 应用”教程将向你介绍 iOS 应用开发中的“三个T”: Tools(工具)如何利用 Xcode 创建和管理工程. Technologies(技术 ...

  4. #学习笔记#e2e学习使用(一)

    本文仅限于记录本人学习的过程,以及怎么踩的坑,是如何解决的.逻辑肯定是混乱的,有用之处会抽出共通另行发帖. 最终目标:要运用于Vue项目中,进行功能测试甚至自动化测试. 一.e2e概念 理解:end ...

  5. Git软件的学习

    第一部分:我的git地址是https://github.com/ZHU19007/gitLearning 第二部分:我对git的认识 一.Git是一款免费.开源的分布式版本控制工具.而Github是用 ...

  6. c++利用互斥锁实现读写锁

    很简单就是在读的时候把写的锁锁住就好了 class readwrite_lock { public: readwrite_lock() : read_cnt(0) { } void readLock( ...

  7. VI编辑器查找替换

    1.Vi下进行查找 VI命令模式下:输入“/要查找的词”回车就会进入查找,你可以按“n”查找下一个,按“N”查找上一个.类似查找命令“?”与“/”的区别是“/”为向下查找,“?”为向上查找. 2.Vi ...

  8. VirtualBox改变虚拟硬盘位置

    原本放虚拟硬盘的位置容量不足,因此将原来的虚拟硬盘放到了一个相对空闲的分区.设置虚拟硬盘位置时出现一点小问题,解决过程记录如下. 1. 将虚拟硬盘复制到目标位置后,假设为“F:\Ubuntu 16.0 ...

  9. 【洛谷P1726】上白泽慧音

    上白泽慧音 题目链接 强联通分量模板题,Tarjan求强联通分量,记录大小即可 #include<iostream> #include<cstring> #include< ...

  10. 【luogu P3371 单源最短路径】 模板 dij + heap

    题目链接:https://www.luogu.org/problemnew/show/P3371#sub 堆优化迪杰斯特拉,留着以后复习用 #include <iostream> #inc ...