当前位置:首页 > 开发 > 编程语言 > Java > 正文

Java序列化的机制和原理

发表于: 2014-08-13   作者:DavidIsOK   来源:转载   浏览:
摘要: 有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍。 Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化

有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍。

Java序列化算法透析

Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。

序列化的必要性

Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。

如何序列化一个对象

一个对象能够序列化的前提是实现Serializable接口,Serializable接口没有方法,更像是个标记。有了这个标记的Class就能被序列化机制处理。

 
  1. importjava.io.Serializable;
  2. classTestSerialimplementsSerializable{
  3. publicbyteversion=100;
  4. publicbytecount=0;
  5. }

然后我们写个程序将对象序列化并输出。ObjectOutputStream能把Object输出成Byte流。我们将Byte流暂时存储到temp.out文件里。

  
  1. publicstaticvoidmain(Stringargs[])throwsIOException{
  2. FileOutputStreamfos=newFileOutputStream("temp.out");
  3. ObjectOutputStreamoos=newObjectOutputStream(fos);
  4. TestSerialts=newTestSerial();
  5. oos.writeObject(ts);
  6. oos.flush();
  7. oos.close();
  8. }

如果要从持久的文件中读取Bytes重建对象,我们可以使用ObjectInputStream。

  
  1. publicstaticvoidmain(Stringargs[])throwsIOException{
  2. FileInputStreamfis=newFileInputStream("temp.out");
  3. ObjectInputStreamoin=newObjectInputStream(fis);
  4. TestSerialts=(TestSerial)oin.readObject();
  5. System.out.println("version="+ts.version);
  6. }

执行结果为

100.

对象的序列化格式

将一个对象序列化后是什么样子呢?打开刚才我们将对象序列化输出的temp.out文件,以16进制方式显示。内容应该如下:

AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65

73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05

63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78

70 00 64

这一坨字节就是用来描述序列化以后的

TestSerial对象的,我们注意到TestSerial类中只有两个域:

publicbyte version = 100;

publicbyte count = 0;

且都是byte型,理论上存储这两个域只需要2个byte,但是实际上temp.out占据空间为51bytes,也就是说除了数据以外,还包括了对序列化对象的其他描述。

Java序列化的机制和原理

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
最近看了下JAVA反序列化机制,发现它还是比想像中的要兼容些。不过还是有一些陷阱,跨语言跨平台的
1.序列化 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程(字节流)。在
继上一个模块之后,此次分析的内容是来到了Hadoop IO相关的模块了,IO系统的模块可谓是一个比较大的
Java对象的序列化就是把一个对象变成二进制的数据流的一中方法,通过对象的序列化可以方便的实现对
反射反射,程序员的快乐! Java中反射机制使用的还是比较广泛的,系统的灵活性、可扩展性大都都是通
前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最后的总结篇来整体说
反射反射,程序员的快乐! Java中反射机制使用的还是比较广泛的,系统的灵活性、可扩展性大都都是通
JAVA堆的描述如下: 内存由 Perm 和 Heap 组成. 其中 Heap = {Old + NEW = { Eden , from, to } } J
对于常用的集合大家都不陌生,但是深入到内部原理可能都是一知半解,通过阅读源码理解如下。 ArrayL
JAVA堆的描述如下: 内存由 Perm 和 Heap 组成. 其中 Heap = {Old + NEW = { Eden , from, to } } J
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号