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生成二维码>,如果想看视频内容请移步慕课网. 维基百科上对于二维码的解释. 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图 ...
随机推荐
- pat乙级1049
浮点型乘整型和整型乘浮点型结果不同,不知为什么. double sum = 0.0; ; i < n; i++) { cin >> a[i]; sum += a[i] * (i + ...
- 关于wp8.1 runtime模式下面的摄像头调用拍照问题和应用生命周期问题
现在的msdn文档,还找不到详细的wp8.1的摄像头拍照文档,只有一个序列拍照,类似九连拍的文档,而且这文档感觉就是windows8.1搬过来应付的,wp8.1模式,只要有一个地方处理不好,手机就会死 ...
- IIS6.0开启gzip压缩
双击IIS服务器,右键点击网站,点击属性,然后点击服务,我们看到HTTP压缩,然后在压缩应用程序文件,压缩静态文件中打钩,然后点击确定,第一步就完成了 然后我们右键点击web服务扩展,点击添加一个 ...
- 用gulp把less文件编译成css文件
第一次使用gulp构建工具,使用gulp将.less文件编译成.css文件并输出.根据视频做了笔记.提供新手和自己以后做参考. HTML文件 <!DOCTYPE html> <htm ...
- 牛客小白月赛5 D 阶乘(factorial) 【前缀】
链接:https://www.nowcoder.com/acm/contest/135/D 题目描述 输入描述: 输入数据共一行,一个正整数n,意义如“问题描述”. 输出描述: 输出一行描述答案: 一 ...
- mysql--连接查询(内外连接)
连接查询又称多表查询,查询到的字段来自于多个表中的数据. 一. 连接查询的分类和语法 1.分类 按标准分: 92标准:只支持内连接 99标准:支持内连接和.外连接和全外连接 功能进行分类: 内连接:i ...
- 同时启动多个tomcat的配置信息
同时启动多个tomcat的配置信息 下面把该配置文件中各端口的含义说明下. <Server port="8005" shutdown="SHUTDOWN" ...
- jsp中的文件上传
首先需要有以下的jar包 jsp代码如下: <!-- ${pageContext.request.contextPath}为: "/" + 当前项目名 --> < ...
- 微信小程序 onLoad 函数
小程序注册完成后,加载页面,触发onLoad方法. 页面载入后触发onShow方法,显示页面. 首次显示页面,会触发onReady方法,渲染页面元素和样式,一个页面只会调用一次. 当小程序后台运行或跳 ...
- PHP计算两个字符的相似程度similar_text
在网站开发中,我们会常常要计算两个字符的相似程度,那么PHP为我们提供了一个函数similar_text; 1,similar_text的用法 如果我想计算"ly89cn"和&q ...