目录

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流(二)的更多相关文章

  1. 登堂入室——java流

    ——文章出自PeterYe,不得私自转载 我所知道的 java.io里面的[流],就仿佛太平洋里面的水一样,浩浩荡荡,横无际涯... -----2016/7/16--------公寓处记录------ ...

  2. Java流

    流是一组有顺序的,有起点和终点的字节集合,是对传输数据的总称或抽象.即数据在两设备间的传输称为流,流的本质是传输数据,依据传输数据特性将流抽象为各种类,方便更直观的进行数据操作. 流的分类: 数据类型 ...

  3. java 流输出的一些问题

    一.java流的控制首先要先准备一个文件,例如:File f = new File(d:/lol.txt); 二.可以使用如下指令创建流,用于不同的用途 1.FileInputStream,FileO ...

  4. 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- ...

  5. 深入理解Java流机制(一)

    一.前言 C语言本身没有输入输出语句,而是调用"stdio.h"库中的输入输出函数来实现.同样,C++语言本身也没有输入输出,不过有别于C语言,C++有一个面向对象的I/O流类库& ...

  6. java web 二维码生成

    pom支持: <!-- 二维码支持包 start--> <dependency> <groupId>com.google.zxing</groupId> ...

  7. Java流式思想和方法引用

    目录 Java流式思想和方法引用 1. Stream流 1.1 概述 传统集合的多步遍历代码 Stream的更优写法 1.2 流式思想的概述 1.3 获取流 1.4 常用方法 ①逐一处理:forEac ...

  8. Java EE : 二、图解 Cookie(小甜饼)

    目录 Java EE : 一.图解Http协议 Java EE : 二.图解 Cookie(小甜饼) Java EE : 三.图解Session(会话) 概述 一.概述 二.详细介绍Cookie 传输 ...

  9. 利用JAVA生成二维码

    本文章整理于慕课网的学习视频<JAVA生成二维码>,如果想看视频内容请移步慕课网. 维基百科上对于二维码的解释. 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图 ...

随机推荐

  1. HDU1043 八数码(BFS + 打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043 , 康托展开 + BFS + 打表. 经典八数码问题,传说此题不做人生不完整,关于八数码的八境界 ...

  2. Trie:字典树

    简介 \(Trie\),又称字典树或前缀树,是一种有序树状的数据结构,用于保存关联数组,其中的键值通常是字符串. 作用 把许多字符串做成一个字符串集合,并可以对其进行快速查找(本文以求多少个单词是一个 ...

  3. hive对有null值的列进行avg,sum,count等操作时会不会过滤null值

    在hive中,我们经常会遇到对某列进行count.sum.avg等操作计算记录数.求和.求平均值等,但这列经常会出现有null值的情况,那这些操作会不会过滤掉null能呢? 下面我们简单测试下: wi ...

  4. python_25_string

    name="my name is 齐志光qizhiguang" print(name.capitalize())#首字母变大写 print(name.count('i'))#统计字 ...

  5. 毛毛虫组【Beta】Scrum Meeting 2

    第二天 日期:2019/6/24 前言 第二次会议: 时间:6月24日 地点:教10-503 内容:此次会议主要是进一步完善系统,分配进行文档的准备工作. 1.1 今日完成任务情况以及遇到的问题. 今 ...

  6. swift 循环语句

    // // main.swift // switch // // Created by lanou on 16/10/21. // Copyright (c) 2016年 lanou. All rig ...

  7. A1020 Tree Traversals (25 分)

    Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...

  8. 三、MySQL PHP 语法

    MySQL PHP 语法 MySQL 可应用于多种语言,包括 PERL, C, C++, JAVA 和 PHP. 在这些语言中,Mysql在PHP的web开发中是应用最广泛. 在本教程中我们大部分实例 ...

  9. Centos7在运行yum命令时出现报错及排查处理过程

    1.1  现象描述 Centos系统在正常重启后,运行yum命令安装软件工具的时候出现以下报错: cannot open Packages index using db5 - Structure ne ...

  10. 【Ecshop】v2.7.3模板变量标签改进

    改进代码后虽可解决大多数函数参数的问题,但也同样产生了参数问题:ecshop模板函数参数有部分没有被引号包裹,所以正则并不能匹配到,要修改为引号包裹,那是个大工程. 为了使ecshop模板支持date ...