java的Serialization 机制
基本使用方法
Serialization是指把类或者基本的数据类型持久化(persistence)到数据流(Stream)中,包括文件、字节流、网络数据流。
JAVA中实现serialization主要靠两个类:ObjectOuputStream和ObjectInputStream。他们是JAVA IO系统里的OutputStream和InputStream的子类。既然他们是JAVA IO中的流,那么就可以像操作一般的流一样来操作他们。下面是他们使用方法:
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.Serializable;
- public class Pair implements Serializable{
- private static final long serialVersionUID = -1874850715617681161L;
- private int type;
- private String name;
- public int getType() {
- return type;
- }
- public void setType(int type) {
- this.type = type;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Pair(int type, String name) {
- super();
- this.type = type;
- this.name = name;
- }
- public static void main(String[] args) throws IOException, ClassNotFoundException {
- // TODO Auto-generated method stub
- //serialize object pair
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream(bos);
- Pair pair = new Pair(1, "charlie");
- oos.writeObject(pair);
- //deserialize object, get new object newpair
- ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
- ObjectInputStream ois = new ObjectInputStream(bis);
- Pair newpair = (Pair) ois.readObject();
- System.out.println(newpair.getType()+":"+newpair.getName());
- }
- }
1. 这两个类都是decorator模式的,在创建他们的时候,都要传入一个基于字节的流,真正在底下存贮序列化数据的都是这些流。
2. 被持久化的类要实现Serializable接口,这个接口没有任何函数,只是一个标记接口。如果在一台机器上进行序列化,把得到的数据传送到另外一个机器上进行反序列化,那么这两台机器上的类应该是完全一样的,否则序列化是不会成功的。
3. 切记不要把上面代码中的bos用toString得到String,然后再从这个String中得到ByteArrayInputStream,再进行反序列化。bos是以字节存贮的,转成以字符存贮的String必然会造成数据的变化,而从String中到的byte[]也不会是之前那个byte[]了。我遇到过这个问题,是因为我想把序列化之后的数据存在xml文件中。这个问题的具体解决方法见我的另外一篇博客:http://zzy1943.iteye.com/blog/634553
java虚拟机在序列化和反序列化的时候都做了些什么?
javadoc中对这两个类的描述中对java的序列化机制进行了详细的描述:
默认的序列化机制写到流中的数据有:
1、对象所属的类
2、类的签名
3、所有的非transient和非static的属性
4、对其他对象的引用也会造成对这些对象的序列化
5、如果多个引用指向一个对象,那么会使用sharing reference机制
- private void readObject(java.io.ObjectInputStream stream)
- throws IOException, ClassNotFoundException;
- private void writeObject(java.io.ObjectOutputStream stream)
- throws IOException
- private void readObjectNoData()
- throws ObjectStreamException;
转载于:https://www.cnblogs.com/rosepotato/p/3404855.html
java的Serialization 机制相关推荐
- Java序列化的机制和原理
有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍. Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述 ...
- Java序列化(Serialization)的理解
2019独角兽企业重金招聘Python工程师标准>>> 1.什么是序列化 Java是面向对象的编程语言,有时需要保存对象,并在下次使用时可以顺利还原该对象.由于这种需求很常见,所以J ...
- serialization机制
首先说明一下序列化的知识: java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输.或者持久化存储到数据库或文件系统中: ...
- java设置缓存机制
2019独角兽企业重金招聘Python工程师标准>>> java设置缓存机制 所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实 ...
- 深入浅出Java垃圾回收机制
2019独角兽企业重金招聘Python工程师标准>>> 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何 ...
- java垃圾回收机制_笔记 | Java垃圾回收机制
本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...
- 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)
在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...
- java Proxy(代理机制)
我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习 ...
- Java的类加载机制
jvm系列 垃圾回收基础 JVM的编译策略 GC的三大基础算法 GC的三大高级算法 GC策略的评价指标 JVM信息查看 GC通用日志解读 jvm的card table数据结构 Java类初始化顺序 J ...
最新文章
- 单列索引和复合索引的使用
- windows 环境下Eclipse开发MapReduce环境设置
- 基本SQL命令-您应该知道的数据库查询和语句列表
- 模式学习(1):Decorator装饰者模式
- (41)FPGA面试题FPGA详细设计流程
- maxwell监控mysql_利用Maxwell组件实时监听Mysql的binlog日志
- CISCO路由器连接ADSL之PPPoE配置
- LibreOJ#6030. 「雅礼集训 2017 Day1」矩阵
- PDA开发从入门到精通
- ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
- 可靠性试验与环境试验概述
- 蒙特卡洛仿真的基于Python实例
- android模拟器克隆app,易语言一键克隆/启动安卓模拟器
- 盟军敢死队I:深入敌后--秘籍
- Windows 7 Service Pack 1已发布:但是您应该安装它吗?
- CentOS7安装 SGE
- 翻译翻译什么叫HTML5(六)“开门,js来查水表啦”
- 什么是“可维护性”?
- Fisherface(FLD)人脸识别实验
- 13种加密与解密算法【一】
热门文章
- zip压缩与解压缩示例
- sql server 的 money类型
- myeclipse6-ejb3入门
- 闲话WPF之十五(WPF的数据处理 [2])
- OpenCV2.3的cvCalcHist函数有问题?255级值总为0,索性自己写一个直方图计算函数,附源码
- OpenCV中的CV_IMPL是什么意思?
- Java中读取控制台输入
- leetcode算法题--设计链表
- linux系统启动过程(二)
- 大话PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置...