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 ...
随机推荐
- Exchange 域用户无权管理邮箱
将需要管理邮箱的域用户添加至“Microsoft Exchange Security Groups”用户组即可.
- (一)svn介绍
项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对代码文件.文档等没有进行版本控制,将会出现很多问题: 备份多个版本,占用磁盘空间大 解决代码冲突困难 容易引发BUG 难于恢复至以前正确版本 ...
- 设计模式之装饰模式(Decorator)
1. 装饰者模式,动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的替代方案. 2.组合和继承的区别 继承.继承是给一个类添加行为的比较有效的途径.通过使用继承,可以使得子类在拥有 ...
- 【css基础】html图片右上角加上删除按钮
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- WAKE-WIN10-SOFT-CMAKE
1,CMAKE 官网:https://cmake.org/ 下载:https://cmake.org/download/ BING:https://www.bing.com/search?q=cmak ...
- 1.Zabbix 3.0 基础
请查看我的有道云笔记: http://note.youdao.com/noteshare?id=85046af7675851675679a47beadc7aa3&sub=000AB0B2409 ...
- 建立virtualenv环境
建立virtualenv环境 virtualenv --no-site-packages yourenv 其中,yourenv是给环境起的名称 --no-site-packages表示安装的pytho ...
- Cloud Foundry Session Affinity(Sticky Session)的实现
会话保持(Session Affinity),有时又称粘滞会话(Sticky Sessions), 是负载均衡领域设计需要着力解决的重要问题之一,也是一个相对比较复杂的问题. 会话保持是指在负载均衡器 ...
- BZOJ3437:小P的牧场(斜率优化DP)
Description 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制 ...
- 动态规划(DP),类似LIS,FatMouse's Speed
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1108 解题报告: 1.首先按照weight从小到大排列,weig ...