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生成二维码>,如果想看视频内容请移步慕课网. 维基百科上对于二维码的解释. 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图 ...
随机推荐
- HDU1043 八数码(BFS + 打表)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 , 康托展开 + BFS + 打表. 经典八数码问题,传说此题不做人生不完整,关于八数码的八境界 ...
- Trie:字典树
简介 \(Trie\),又称字典树或前缀树,是一种有序树状的数据结构,用于保存关联数组,其中的键值通常是字符串. 作用 把许多字符串做成一个字符串集合,并可以对其进行快速查找(本文以求多少个单词是一个 ...
- hive对有null值的列进行avg,sum,count等操作时会不会过滤null值
在hive中,我们经常会遇到对某列进行count.sum.avg等操作计算记录数.求和.求平均值等,但这列经常会出现有null值的情况,那这些操作会不会过滤掉null能呢? 下面我们简单测试下: wi ...
- python_25_string
name="my name is 齐志光qizhiguang" print(name.capitalize())#首字母变大写 print(name.count('i'))#统计字 ...
- 毛毛虫组【Beta】Scrum Meeting 2
第二天 日期:2019/6/24 前言 第二次会议: 时间:6月24日 地点:教10-503 内容:此次会议主要是进一步完善系统,分配进行文档的准备工作. 1.1 今日完成任务情况以及遇到的问题. 今 ...
- swift 循环语句
// // main.swift // switch // // Created by lanou on 16/10/21. // Copyright (c) 2016年 lanou. All rig ...
- A1020 Tree Traversals (25 分)
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...
- 三、MySQL PHP 语法
MySQL PHP 语法 MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP. 在这些语言中,Mysql在PHP的web开发中是应用最广泛. 在本教程中我们大部分实例 ...
- Centos7在运行yum命令时出现报错及排查处理过程
1.1 现象描述 Centos系统在正常重启后,运行yum命令安装软件工具的时候出现以下报错: cannot open Packages index using db5 - Structure ne ...
- 【Ecshop】v2.7.3模板变量标签改进
改进代码后虽可解决大多数函数参数的问题,但也同样产生了参数问题:ecshop模板函数参数有部分没有被引号包裹,所以正则并不能匹配到,要修改为引号包裹,那是个大工程. 为了使ecshop模板支持date ...