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流、序列化的更多相关文章

  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. SQL Server ->> 重新创建Assembly和自动重建相关的数据库编程对象(存储过程,函数和触发器)

    在SQL Server中,一旦一个Assembly被其他的数据库编程对象(存储过程,函数和触发器)引用了,这个Assembly就不能被删除.但是问题是,在SQL Server要更新一个Assembly ...

  2. (五)TortoiseSVN 客户端-----安装

    svn客户端类型 svn客户端需要通过网络访问svn服务端提交文件.查询文件等,可通过以下客户端类型访问svn服务端: 使用Subversion提供的客户端命令,使用方式:在命令行下输入命令操作. 使 ...

  3. 1.6 WEB API NET CORE 使用Redis

    一.Redis安装 https://www.cnblogs.com/cvol/p/9174078.html 二.新建.net core web api程序 选webapi 或者应用程序都可以 三.使用 ...

  4. 基于配置的Spring AOP

    前面几篇学习了Spring的依赖注入,这篇开始学习另一个核心功能——面向切面编程AOP. 通过本文,你可以了解到: 1 Spring xml规范 2 通过配置文件实现面向切面编程 3 对比与传统AOP ...

  5. OpenGL总结

    最近2D转向3D,也从固定管线转到了可编程管线,有些细节的东西记录一下. Geometry Shader Geometry Shader从Vertex Shader中获取数据,向Fragment Sh ...

  6. Android 位置服务

    原文来自:http://developer.android.com/guide/topics/location/strategies.html 位置策略 注意: 本指南仅限android.locati ...

  7. 2018.11.1 Hibernate中的Mapper关系映射文件

    Customer.hbm.xml 基本的参数都在里面了 <?xml version="1.0" encoding="UTF-8"?> <!DO ...

  8. readonly disabled

    $("#cpeIdInput").attr('disabled',false);  //禁用之后数据提交不到后台(IE),解决方法在点击按钮时禁用,想办法在提交之前(beforeS ...

  9. css3中有关transform的问题

    Transform属性应用于元素的2D或3D转换.这个属性允许你将元素旋转,缩放,移动,倾斜等.

  10. vue 修改框架less变量

    以vant框架为例,vue项目以less作为css处理器: less/var-reset.less @import '~vant/lib/index.less'; // Color variables ...