基本使用方法      
        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 pairByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);Pair pair = new Pair(1, "charlie");oos.writeObject(pair);//deserialize object, get new object newpairByteArrayInputStream 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的序列化机制进行了详细的描述:

The default serialization mechanism for an object writes the class of the object, the class signature, and the values of all non-transient and non-static fields. References to other objects (except in transient or static fields) cause those objects to be written also. Multiple references to a single object are encoded using a reference sharing mechanism so that graphs of objects can be restored to the same shape as when the original was written.

默认的序列化机制写到流中的数据有:
1、对象所属的类
2、类的签名
3、所有的非transient和非static的属性
4、对其他对象的引用也会造成对这些对象的序列化
5、如果多个引用指向一个对象,那么会使用sharing reference机制

Classes that require special handling during the serialization and deserialization process must implement special methods with these exact signatures:

 private void readObject(java.io.ObjectInputStream stream)throws IOException, ClassNotFoundException;private void writeObject(java.io.ObjectOutputStream stream)throws IOExceptionprivate void readObjectNoData() throws ObjectStreamException;

java的Serialization机制相关推荐

  1. java的Serialization 机制

    基本使用方法                Serialization是指把类或者基本的数据类型持久化(persistence)到数据流(Stream)中,包括文件.字节流.网络数据流.        ...

  2. Java序列化的机制和原理

    有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍. Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述 ...

  3. Java序列化(Serialization)的理解

    2019独角兽企业重金招聘Python工程师标准>>> 1.什么是序列化 Java是面向对象的编程语言,有时需要保存对象,并在下次使用时可以顺利还原该对象.由于这种需求很常见,所以J ...

  4. serialization机制

    首先说明一下序列化的知识:  java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输.或者持久化存储到数据库或文件系统中: ...

  5. java设置缓存机制

    2019独角兽企业重金招聘Python工程师标准>>> java设置缓存机制 所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实 ...

  6. 深入浅出Java垃圾回收机制

    2019独角兽企业重金招聘Python工程师标准>>> 对于Java开发人员来说,了解垃圾回收机制(GC)有哪些好处呢?首先可以满足作为一名软件工程师的求知欲,其次,深入了解GC如何 ...

  7. java垃圾回收机制_笔记 | Java垃圾回收机制

    本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...

  8. 异常处理器详解 Java多线程异常处理机制 多线程中篇(四)

    在Thread中有异常处理器相关的方法 在ThreadGroup中也有相关的异常处理方法 示例 未检查异常 对于未检查异常,将会直接宕掉,主线程则继续运行,程序会继续运行 在主线程中能不能捕获呢? 我 ...

  9. java Proxy(代理机制)

    我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习 ...

  10. Java的类加载机制

    jvm系列 垃圾回收基础 JVM的编译策略 GC的三大基础算法 GC的三大高级算法 GC策略的评价指标 JVM信息查看 GC通用日志解读 jvm的card table数据结构 Java类初始化顺序 J ...

最新文章

  1. Pytorch 多 GPU 并行处理机制
  2. classlist使用方法_如何通过使用HTML5的classList API在没有jQuery的情况下操作类
  3. int *p,cons int *p,int const *p,int * const p,const int * const p,int const * const p的区别
  4. 预约清单ui设计_持续交付质量设计所需的UI清单
  5. linux之hexdump命令
  6. 牛客题霸 [ 最长回文子串] C++题解/答案
  7. Matlab将一矩阵中等于某个值的元素全部替换成另一个值
  8. 一步一步写算法(之排序二叉树线索化)
  9. Visual C# 2008+SQL Server 2005 数据库与网络开发――3.1.3 C# 2008和.NET Framework 3.5的关系...
  10. mysql root拿shell_mysql的几种获取shell和提权的方式
  11. Atitit 局部图查找大图 方法 与 说明
  12. mysql角色管理权限管理_mysql权限角色管理
  13. 如何在arcgis中制作土地利用转移矩阵
  14. dcp9030cdn定影_兄弟DCP-9030CDN驱动
  15. html5搜狗浏览器缓存文件夹,搜狗浏览器中怎么查找之前看过的视频文件?
  16. web之线性渐变,径向渐变,重复渐变
  17. 工业机器人导轨 百度文库_最新工业机器人复习资料
  18. Java入门之顺序、选择、循环结构
  19. Android 13新特性:自动清除剪贴板历史记录
  20. 简单的下拉列表的二级联动、省市

热门文章

  1. Python+Selenium实现网页截图
  2. 聚沙成塔--爬虫系列(四)(爬取糗事百科段子)
  3. Phyton安装MySQL驱动
  4. Mapped Statements collection already contains value for xxx
  5. 纳什均衡C++简单实现
  6. 科大讯飞python 思维导图
  7. Day434.订单库存服务分布式事务的最终解决 -谷粒商城
  8. ubuntu18.04环境下为UR3配置MoveIt!运动学插件IKFAST(一)
  9. AudioTrack音频播放
  10. Wireshark文档阅读笔记-TCP Flags