java流(二)
目录
1 ObjectOutputStream/ObjectInputStream的使用
2 序列化
3 具体序列化的过程
4 Externalizable的简易介绍
实现序列化的Person类
/**
* 测试序列化所用的类
*/
class Person implements Serializable {
private String username;
private transient String password; //反序列化
public Person(String username,String password) {
this.username = username;
this.password = password;
}
public String toString() {
StringBuffer str = new StringBuffer();
str.append("username=" + this.username+"\r\n");
str.append("password=" + this.password);
return str.toString();
}
}
注意 password字段使用了transient表示,该字段不实现序列化(即,读取这个类时这个字段的值恒定位null)
测试方法
public class SerializableTest2 {
public static void main(String args[]) throws IOException, ClassNotFoundException {
testObjectSeri();
testObjectInSeri();
}
public static void testObjectSeri() throws IOException {
Person person = new Person("测试", "java");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.dat"));
oos.writeObject("字符串");
oos.writeObject(person);
oos.flush();
oos.close();
System.out.println("入参:"+"\r\n"+"字符串 "+"\r\n"+person.toString());
}
public static void testObjectInSeri() throws IOException,
ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.dat"));
String str = (String) ois.readObject();
System.out.println(str);
Person person = (Person) ois.readObject();
ois.close();
System.out.println(person.toString());
}
}
执行结果
入参:
字符串
username=测试
password=java
字符串
username=测试
password=null
注意读取数据时要按照传入顺序转换成对应的对象类型。
我们再来详细的看一下,序列化的过程
改造一下Person类
class Person implements Serializable {
private String username;
private transient String password; //反序列化
public Person(String username,String password) {
this.username = username;
this.password = password;
}
public String toString() {
StringBuffer str = new StringBuffer();
str.append("username=" + this.username+"\r\n");
str.append("password=" + this.password);
return str.toString();
}
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
System.out.println("writeObject invoked");
}
private void readObject(java.io.ObjectInputStream in) throws IOException,
ClassNotFoundException {
System.out.println("readObject invoked");
}
private Object writeReplace() throws ObjectStreamException {
System.out.println("writeReplace invoked");
return this;
}
private Object readResolve() throws ObjectStreamException {
System.out.println("readResolve invoked");
return this;
}
}
继续使用上面的测试方法
执行结果
writeReplace invoked
writeObject invoked
入参:
字符串
username=测试
password=java
字符串
readObject invoked
readResolve invoked
username=null
password=null
序列化与反序列化的内部执行按照以下顺序
writeReplace --> writeObject
readObject --> readResolve
结论
当进行序列化的时候:
首先JVM会先调用writeReplace方法,在这个阶段,我们可以进行张冠李戴,将需要进行序列化的对象换成我们指定的对象. (入口)
跟着JVM将调用writeObject方法,来将对象中的属性一个个进行序列化,我们可以在这个方法中控制住哪些属性需要序列化.
当反序列化的时候:
JVM会调用readObject方法,将我们刚刚在writeObject方法序列化好的属性,反序列化回来.
然后在readResolve方法中,我们也可以指定JVM返回我们特定的对象(不是刚刚序列化回来的对象).
另外 Externalizable 和是一个有实际方法需要实现的interface,包括writeExternal和readExternal:
现在在person后面添加这2个方法
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
System.out.println("readExternal"); } public void writeExternal(ObjectOutput out) throws IOException {
System.out.println("writeExternal");
}
执行结果
writeReplace invoked
writeExternal//-----覆盖之前的方法被执行
入参:
字符串
username=测试
password=java
readExternal//-----覆盖之前的方法被执行
readResolve invoked
username=null
password=null
参考文章
http://www.cnblogs.com/xt0810/p/3642904.html
http://dovecat.iteye.com/blog/66044
http://blog.csdn.net/yakihappy/article/details/3979373
http://developer.51cto.com/art/200908/147650.htm
http://dusiguxia.blog.163.com/blog/static/55629316201162635435180/
java流(二)的更多相关文章
- 登堂入室——java流
——文章出自PeterYe,不得私自转载 我所知道的 java.io里面的[流],就仿佛太平洋里面的水一样,浩浩荡荡,横无际涯... -----2016/7/16--------公寓处记录------ ...
- Java流
流是一组有顺序的,有起点和终点的字节集合,是对传输数据的总称或抽象.即数据在两设备间的传输称为流,流的本质是传输数据,依据传输数据特性将流抽象为各种类,方便更直观的进行数据操作. 流的分类: 数据类型 ...
- java 流输出的一些问题
一.java流的控制首先要先准备一个文件,例如:File f = new File(d:/lol.txt); 二.可以使用如下指令创建流,用于不同的用途 1.FileInputStream,FileO ...
- java 生成二维码、可带LOGO、可去白边
1.准备工作 所需jar包: JDK 1.6: commons-codec-1.11.jar core-2.2.jar javase-2.2.jar JDK 1.7: commons-codec- ...
- 深入理解Java流机制(一)
一.前言 C语言本身没有输入输出语句,而是调用"stdio.h"库中的输入输出函数来实现.同样,C++语言本身也没有输入输出,不过有别于C语言,C++有一个面向对象的I/O流类库& ...
- java web 二维码生成
pom支持: <!-- 二维码支持包 start--> <dependency> <groupId>com.google.zxing</groupId> ...
- Java流式思想和方法引用
目录 Java流式思想和方法引用 1. Stream流 1.1 概述 传统集合的多步遍历代码 Stream的更优写法 1.2 流式思想的概述 1.3 获取流 1.4 常用方法 ①逐一处理:forEac ...
- Java EE : 二、图解 Cookie(小甜饼)
目录 Java EE : 一.图解Http协议 Java EE : 二.图解 Cookie(小甜饼) Java EE : 三.图解Session(会话) 概述 一.概述 二.详细介绍Cookie 传输 ...
- 利用JAVA生成二维码
本文章整理于慕课网的学习视频<JAVA生成二维码>,如果想看视频内容请移步慕课网. 维基百科上对于二维码的解释. 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图 ...
随机推荐
- RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
1. AMF AMF(是Action Message Format的缩写)是在flash和flex中与远程服务端交换数据的一种格式.它是二进制格式,Flash应用与服务端或数据库通过RPC交换数据时, ...
- 免费的freedns实现动态域名和url转发
路由器的固件是dd-wrt 到freedns.afraid.org上注册一个动态域名,如果默认的端口无法使用80,需要配置二级域名的url转发功能. 实测2个月很稳定. 另外为了防止主机ip地址更新频 ...
- bit Byte KB MB GB TB 单位换算
1TB = 1024G 1G = 1024M 1M = 1024K 1K = 1024 byte 1 byte = 8 bit
- hdu-1598 find the most comfortable road---kruskal+枚举下界
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1598 题目大意: XX星有许多城市,城市之间通过一种奇怪的高速公路SARS(Super Air Ro ...
- [论文理解]MetaAnchor: Learning to Detect Objects with Customized Anchors
MetaAnchor: Learning to Detect Objects with Customized Anchors Intro 本文我其实看了几遍也没看懂,看了meta以为是一个很高大上的东 ...
- python模块;opencv安装
http://www.lfd.uci.edu/~gohlke/pythonlibs/ 1. 步骤1. 下载Python2.73, 安装, 并配置Python环境变量:".\Program F ...
- centos 7 安装以及ip配置
1.安装: root 200M: swap 内存的2倍,如果内存超过4g,最大设为8g就够了: / 剩余: 2.ip配置 (1)动态配置:dhclient ip add (2)静态配置:vi /etc ...
- Java 数值计算精度问题
最近刚好做到涉及金额方面的项目,不像普通in,double,floatt类型来修饰,而是用BigDecimal来修饰,就去收集下了这方面的资料,整理如下: 1.float和double只能用来做科学计 ...
- 第三篇:彻底解决ssh.invoke_shell() 返回的中文问题
接上一篇,前两篇解决中文的问题主要是在字符集上做的手脚,即将中文转成英文,但是有一种情况我们都来不及做转换,即登录时服务器直接返回了中文内容: 此时程序报了如下错误,其实还是字符集问题: 为此:我们可 ...
- 传智 杨中科老师 ASP.NET 笔记