Java IO之序列化
序列化机制是Java语言内建的一种对象持久化方式,可以很容易的在JVM中的活动对象和字节数组之间转换。它的一个重要用途就是远程方法调用的时候,用来对开发人员屏蔽底层实现细节(远端的开发人员不知道这个对象的具体实现细节,通过序列化技术可以直接还原为一个对象,直接拿来用即可)。
如何实现序列化
待序列化的类只要实现Serializable接口即可,该接口是一个标记接口,没有任何方法。
实际的序列化由ObjectOutputStream和ObjectInputStream来完成。前者可以调用其writeObject方法来将一个Java对象写入流中,后者可以用readObject方法来从流中读取一个Java对象。
在默认的序列化实现中,Java对象的非静态和非瞬时域都会被包括进来,而与域的可见性声明没有关系。
如果你的对象中含有敏感信息,比如user这个对象里面含有password这个域,则如果不想被序列化,必须在前面添加transient关键词。或者添加一个serialPersistentFields域来声明序列化时要包含的域。
private static final objectStreamField[] serialPersistentFileds = {
new ObjectStreamFiled("firstName", String.class);
};
自定义对象序列化
通过自定义可以对序列化的过程进行更加细粒度的控制,但是要在类中添加writeObject和readObject方法。
在通过ObjectOutputStream的writeObject方法写入对象的时候,如果这个对象定义了writeObject方法,就会调用该方法,并把当前的ObjectOutputStream对象作为参数传递进去。
writeObject方法中一般会包含自定义的序列化逻辑,比如在写入之前修改域的值,或是写入额外的数据等。
在添加自己的逻辑之前,推荐的做法是先调用Java的默认实现,在writeObject方法中通过ObjectOutputStream的defaultWriteObject来完成。在readObject方法实现方式也类似。
private void writeObject(ObjectOutputStream output) throws IOException {
output.defaultWriteObject();
// 在这里添加自定义逻辑
output.writeUTF("Hello World");
}
序列化的对象替换
假设你要在网上买东西,在购物表单上添加信息,然后将这个请求发送到远端,即把一个order对象发送到远端,准备在远端将其还原,如果order对象的属性里面有customer的对象引用,则在序列化order的时候,可能也会将customer也序列化。这时候,就涉及到用户的隐私泄露的问题。
所以,必须采取别的方法实现只在远端还原order对象即可。
这个方法就是:用一个替换对象类orderReplace只保存order的ID,在Oder类的writeReplace方法中返回一个OrderReplace对象。这个对象会被作为替代写入到流中,同样,需要OrderReplace类中定义一个readResolve方法,用在读取的时候再转换回Order类对象。
OrderReplace类:
private static class OrderReplace implements Serializable {
private static final long serialVersionUID = 4654546423735192613L;
private String orderId;
public OrderReplace(Order order) {
this.orderId = order.getId();
}
private Object readResolve() throws ObjectStreamException {
//根据orderId查找Order对象并返回
}
}
Order类:
private Object writeReplace() throws ObjectStreamException {
return new OrderReplace(this);
}
Java IO之序列化的更多相关文章
- java.io.Serializable 序列化问题
java.io.Serializable 序列化问题 Person.java package a.b.c; public class Person implements java.io.Seriali ...
- java.io.Serializable 序列化问题【原】
java.io.Serializable 序列化问题 Person.java package a.b.c; public class Person implements java.io.Seriali ...
- java.io.Serializable 序列化接口
什么是序列化.反序列化? Serialization(序列化)是一种将对象以一连串的字节描述的过程: 反序列化deserialization是一种将这些字节重建成一个对象的过程. 序列化通俗一点说就是 ...
- Netty学习二:Java IO与序列化
1 Java IO 1.1 Java IO 1.1.1 IO IO,即输入(Input)输出(Output)的简写,是描述计算机软硬件对二进制数据的传输.读写等操作的统称. 按照软硬件可分为: 磁盘I ...
- Java Io 对象序列化和反序列化
Java 支持将任何对象进行序列化操作,序列化后的对象文件便可通过流进行网络传输. 1. 对象序列化就是将对象转换成字节序列,反之叫对象的反序列化 2. 序列化流ObjectOut ...
- Java IO流-序列化流和反序列化流
2017-11-05 20:42:06 序列化流:把对象按照流的方式存入文本文件或者在网络中传输. 对象 -- 流数据(ObjectOutputStream) 反序列化流:把文本文件中的流对象数据或者 ...
- java IO流详解
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- java对象的序列化与反序列化使用
1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道,当两个进程进 ...
- Java IO流详尽解析
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
随机推荐
- LP64是什么意思
在64位机器上,如果int是32位,long是64位,pointer也是64位,那么该机器就是LP64的,其中的L表示Long,P表示Pointer,64表示Long和Pointer都是64位的.由于 ...
- yii2 访问控制
class SiteController extends Controller{ /** * @inheritdoc */ public function behaviors() { return [ ...
- [ofbiz]less-than (<) and greater-than (>) symbols
问题描述: In field [updateItemStr] less-than (<) and greater-than (>) symbols are not allowed 此处的f ...
- Lucene学习总结之四:Lucene索引过程分析
对于Lucene的索引过程,除了将词(Term)写入倒排表并最终写入Lucene的索引文件外,还包括分词(Analyzer)和合并段(merge segments)的过程,本次不包括这两部分,将在以后 ...
- Ecstore中如何调用发起Ajax请求
Ecstore的JS框架使用了mootools,所以ajax调用也使用mootools中的Request组件. 语法: var myRequest = new Request([options]); ...
- Frogger(最短路)
Frogger(poj2253) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 31854 Accepted: 1026 ...
- 利用fiddler录制脚本
特性说明: 版本:V4.4 用途:将fiddler抓取的请求,导出为jmx格式,方便jmeter直接调用 新增功能: 1.在测试计划下,新增[HTTP请求默认值],内容为空,后续需将站点的IP和端口填 ...
- C++----练习--引用头文件
1.创建头文件和源文件 touch /tmp/tools.h touch /tmp/main.cpp 2.各文件的内容如下: tools.h #include<iostream> void ...
- linux系统文件夹的作用 good
/bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 如:环境变量 /etc/rc.d 启动的配置文件和脚本 /home用户主目录的基点,比如用户user的主目录就是/ho ...
- javascript之Boolean
一.new Boolean(value); //构造函数 Boolean(value); //转换函数 0,NaN,null,"",undefined都会转成false,其他都会返 ...