`
ztianlong
  • 浏览: 66668 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java序列化的机制和思想

阅读更多

本文讲说了Java序列化的机制和思想。从文中你没成绩了解如何序列化一个的对象,什么时间需求序列化以及Java序列化的算法。

  •  
    1. 00 00 00 0B: 11, containVersion的value.
  •  
    1. 0x70:TC_NULL,没有超类了。
  •  
    1. 0x49: 域类别. 49 代表"I", 也那是Int..
    2. 00 0E: 域姓名长度.
    3. 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E: containVersion, 域姓名描述.
    4. 0x78: TC_ENDBLOCKDATA对象块结束的标志.
  •  
    1. 0x73: TC_OBJECT, 声明这是一个的新的对象.
    2. 0x72: TC_CLASSDESC声明那里开始一个的新Class.
    3. 00 07: 类名的长度.
    4. 63 6F 6E 74 61 69 6E: contain,类名描述.
    5. FC BB E6 0E FB CB 60 C7: SerialVersionUID, 序列化ID.
    6. 0x02: Various flags. 标识号. 该value声明该对象支持序列化
    7. 00 01: 类内的域个数。
  •  
    1. 00 00 00 42: 66, version域的value.
  •  
    1. 00 00 00 0A: 10, pare ntVersion域的value.
  •  
    1. 0x49: 域类别. 49 代表"I", 也那是Int.
    2. 00 0D: 域姓名长度.
    3. 70 61 72 65 6E 74 56 65 72 73 69 6F 6E: pare ntVersion,域姓名描述。
    4. 0x78: TC_ENDBLOCKDATA,对象块结束的标志。
    5. 0x70: TC_NULL, 说明没有更多相关超类的标志。.
  •  
    1. 0x72: TC_CLASSDESC. 声明那个是个新类.
    2. 00 06: 类名长度.
    3. 70 61 72 65 6E 74: pare nt,类名描述。
    4. 0E DB D2 BD 85 EE 63 7A: SerialVersionUID, 序列化ID.
    5. 0x02: 标识号. 该value声明该对象支持序列化.
    6. 00 01: 类中域的个数.
  •  
    1. 0x4C: 域的类别.
    2. 00 03: 域姓名长度.
    3. 63 6F 6E: 域姓名描述,con
    4. 0x74: TC_STRING. 代表一个的new String.String来引用对象。
    5. 00 09: String长度.
    6. 4C 63 6F 6E 74 61 69 6E 3B: Lcontain;, JVM的达标对象签名表明法.
    7. 0x78: TC_ENDBLOCKDATA,对象数据块结束的标志
  •  
    1. 0x49: 域类别. 49 代表"I", 也那是Int.
    2. 00 07: 域姓名的长度.
    3. 76 65 72 73 69 6F 6E: version,域姓名描述.
  •  
    1. 0x72: TC_CLASSDESC. 声明那里开始一个的新Class
    2. 00 0A: Class姓名的长度.
    3. 53 65 72 69 61 6c 54 65 73 74: SerialTest,Class类名.
    4. 05 52 81 5A AC 66 02 F6: SerialVersionUID, 序列化ID,假如没有指定,则会由算法随机生成一个的8byteID.
    5. 0x02: 标识号. 该value声明该对象支持序列化。
    6. 00 02: 该类所包含的域个数。
  •  
    1. AC ED: STREAM_MAGIC. 声明应用了序列化规则.
    2. 00 05: STREAM_VERSION. 序列化规则版本.
    3. 0x73: TC_OBJECT. 声明这是一个的新的对象.  
  •  
    1. public static void main(String args[]) throws IOException {  
    2.  
    3.        FileOutputStream fos = new FileOutputStream("temp.out");  
    4.  
    5.        ObjectOutputStream oos = new ObjectOutputStream(fos);  
    6.  
    7.        TestSerial ts = new TestSerial();  
    8.  
    9.        oos.recordObject(ts);  
    10.  
    11.        oos.flush();  
    12.  
    13.        oos.close();  
    14.  
  •  

    有关Java对象的序列化和反序列化也算是Java基础的一些,下面对Java序列化的机制和思想停止一些介绍。

    Java序列化算法透析

    Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这一些字节重建成一个的对象的过程。Java序列化API帮助一种处理对象序列化的达标机制。在那里你能学到如何序列化一个的对象,什么时间需求序列化以及Java序列化的算法,咱们用一个的举例来示范序列化以后的字节是如何描述一个的对象的消息的。

    序列化的必要性

    Java中,一切都是对象,在分布式环境中经常需求将Object从这一端互联网或设备传递到另一端。这就需求有一种没成绩在两端传输数据的规则。Java序列化机制那是为了解决那个难点而产生。

    如何序列化一个的对象

    一个的对象能够序列化的前提是出现Serializable接口,Serializable接口没有窍门,更像是个标识。有了那个标识的Class就能被序列化机制处理。

  1. import java.io.Serializable;  
  2.  
  3. class TestSerial implements Serializable {  
  4.  
  5.        public byte version = 100;  
  6.  
  7.        public byte count = 0;  
  8.  

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

假如要从持久的文档中读取Bytes重建对象,咱们没成绩应用ObjectInputStream  

  1. public static void main(String args[]) throws IOException {  
  2.  
  3.        FileInputStream fis = new FileInputStream("temp.out");  
  4.  
  5.        ObjectInputStream oin = new ObjectInputStream(fis);  
  6.  
  7.        TestSerial ts = (TestSerial) oin.readObject();  
  8.  
  9.        System.out.println("version="+ts.version);  
  10.  

运行结果为

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类中只有两个域:

public byte version = 100;

public byte count = 0;

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

Java的序列化算法

序列化算法一般会按步骤做如下事件:

将对象举例有关的类元数据输出。

递归地输出类的超类描述直到不再有超类。

类元数据完了以后,开始从最顶层的超类开始输出对象举例的实际数据value。

从上至下递归输出举例的数据

咱们用另一个的更完整覆盖所有估计出现的情况的例子来说明:

  1. class pare nt implements Serializable {  
  2.  
  3.        int pare ntVersion = 10;  
  4.  
  5. }  
  6.  
  7.    
  8.  
  9. class contain implements Serializable{  
  10.  
  11.        int containVersion = 11;  
  12.  
  13. }  
  14.  
  15. public class SerialTest extends pare nt implements Serializable {  
  16.  
  17.        int version = 66;  
  18.  
  19.        contain con = new contain();  
  20.  
  21.    
  22.  
  23.        public int getVersion() {  
  24.  
  25.               rechanging version;  
  26.  
  27.        }  
  28.  
  29.        public static void main(String args[]) throws IOException {  
  30.  
  31.               FileOutputStream fos = new FileOutputStream("temp.out");  
  32.  
  33.               ObjectOutputStream oos = new ObjectOutputStream(fos);  
  34.  
  35.               SerialTest st = new SerialTest();  
  36.  
  37.               oos.recordObject(st);  
  38.  
  39.               oos.flush();  
  40.  
  41.               oos.close();  
  42.  
  43.        }  
  44.  

那个例子是相当的直白啦。SerialTest类出现Pare nt超类,内部还持有一个的Container对象。

序列化后的格式如下:

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

73 74 05 52 81 5A AC 66 02 F6 02 00 02 49 00 07

76 65 72 73 69 6F 6E 4C 00 03 63 6F 6E 74 00 09

4C 63 6F 6E 74 61 69 6E 3B 78 72 00 06 70 61 72

65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 01 49 00

0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70

00 00 00 0A 00 00 00 42 73 72 00 07 63 6F 6E 74

61 69 6E FC BB E6 0E FB CB 60 C7 02 00 01 49 00

0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78

70 00 00 00 0B

咱们来仔细看看这一些字节都代表了啥。开头部份,见颜色

序列化算法的第一步那是输出对象有关类的描述。例子所示对象为SerialTest类举例,因此接下来输出SerialTest类的描述。见颜色

接下来,算法输出其中的一个的域,int version=66;见颜色

然后,算法输出下一个的域,contain con = new contain();那个有点特殊,是个对象。描述对象类别引用时需求应用JVM的达标对象签名表明法,见颜色

.接下来算法就会输出超类也那是Pare nt类描述了,见颜色

下一步,输出pare nt类的域描述,int pare ntVersion=100;同见颜色

到此为止,算法已经对所有的类的描述都做了输出。下一步那是把举例对象的实际value输出了。这时间是从pare nt Class的域开始的,见颜色

还有SerialTest类的域:

再往后的bytes较量有意思,算法需求描述contain类的消息,要记住,目前还没有对contain类停止过描述,见颜色

.输出contain的一个的域描述,int containVersion=11

这时,序列化算法会检查contain也许有超类,假如有的话会接着输出。

最后,将contain类实际域value输出。

OK,咱们研讨了java序列化的机制和思想,期望能对校友们有所帮助。

本文来自longdick的博客:《Java序列化算法透析》

分享到:
评论

相关推荐

    一个基于java jaxb的序列化例子,非常简单易懂

    Java JAXB(Java Architecture for XML Binding)是Java平台上的一个标准组件,用于XML和Java对象之间的绑定,实现了XML的序列化和反序列化。这个技术使得开发者可以方便地将Java对象转换为XML文档,同时也可以从XML...

    XML操作 面向对象其一(封装) 序列化 反序列化 练习

    在Java中,我们可以使用`Transformer`和`DOMSource`来实现对象到XML的序列化。反序列化则是相反的过程,将XML数据转换回对象。Java提供了`DocumentBuilderFactory`和`DocumentBuilder`来解析XML字符串,并通过反射...

    java基础编程思想

    书中会讲解流的分类、基本的读写操作,以及缓冲区、对象序列化等相关内容。 9. **多线程**:Java提供了内置的多线程支持,可以创建并发执行的任务。书中会介绍Thread类和Runnable接口,以及同步机制(synchronized...

    java核心思想第7版卷1英文版

    6. **输入/输出流**:Java的I/O系统提供了丰富的类库用于数据的读写,包括文件I/O、网络I/O和对象序列化等。 7. **多线程**:Java内置了对多线程的支持,书中会介绍如何创建和管理线程,以及同步和互斥的概念,如...

    Java编程思想习题答案代码

    《Java编程思想习题答案代码》是一份针对学习Java编程思想的宝贵资源,它提供了书中的课后习题解答,旨在帮助学习者在探索Java语言的过程中进行实践和检验自己的理解。这份资料通常与《Thinking in Java》这本书配套...

    Java 编程思想中文第三版(PDF)

    - 序列化:对象持久化的手段,以及反序列化的实现。 - 内存管理:垃圾收集机制,以及如何避免内存泄漏。 5. **网络编程** - Socket编程:创建TCP/IP连接,发送和接收数据。 - URL与URLConnection:通过HTTP协议...

    java编程思想需要的包

    5. **输入/输出流**:文件操作、对象序列化、网络通信等。 6. **多线程**:线程的创建、同步、并发控制,以及线程池的使用。 7. **反射**:在运行时动态访问类和对象的能力,以及动态代理。 8. **枚举与注解**:...

    Java编程思想练习题答案

    练习题可能涵盖字节流、字符流、缓冲流、对象序列化等。 7. **多线程**:Java提供了内置的多线程支持,理解线程的创建、同步和通信,如synchronized关键字、wait()、notify()和join()方法,是解决并发问题的基础。 ...

    Java编程思想 Thinking in Java 课后习题答案

    《Java编程思想》是 Bruce Eckel 的经典著作,它深入浅出地讲解了Java语言的核心概念和编程技术。这本书不仅提供了丰富的理论知识,还包含了大量练习题,旨在帮助读者巩固和提升编程技能。课后习题答案对于学习者来...

    java高级(思想)书

    读者将学习到如何在Java中创建和管理线程,理解线程同步机制,如synchronized关键字、volatile变量、wait()和notify()方法,以及Lock接口和ReentrantLock等高级并发工具。此外,书中可能还介绍了如何应用设计模式...

    java版msn Java源码 搜集的Java msn代码

    3. **对象序列化与反序列化**:为了在网络间传输对象,Java提供了序列化机制。在Java版MSN中,可能会使用到ObjectOutputStream和ObjectInputStream进行对象的序列化和反序列化,以便在网络中传输用户信息和消息。 4...

    Java编程思想 中文文档

    - **对象序列化**:将对象转化为字节流进行持久化存储或网络传输。 6. **多线程**: - **线程的创建与管理**:通过Thread类和Runnable接口创建线程,理解同步机制如synchronized关键字和wait/notify机制。 - **...

    Java 编程思想.第四版.课后练习答案

    还有BufferedReader、BufferedWriter等缓冲流提高性能,FileReader、FileWriter用于文件操作,ObjectInputStream和ObjectOutputStream用于序列化和反序列化。 8. **多线程**:Java内置了对多线程的支持,通过Thread...

    Java图书图书管理系统报告.doc

    1. Java序列化机制:在本系统中,我们使用了Java的序列化机制来实现图书对象的存储和读取。在 Book 类中,我们实现了Serializable接口,并重写了writeObject()和readObject()方法,以便将图书对象的状态保存到文件中...

    Java编程思想【第4版】习题答案

    6. **输入/输出与文件操作**:Java的IO流体系使得处理数据输入输出变得简单,包括文件读写、序列化等。答案会展示各种IO操作的实现。 7. **泛型**:Java的泛型提高了代码的类型安全性和重用性,习题答案会介绍如何...

    java 编程思想4(中文版pdf)

    包括集合的并发处理、集合的排序和比较、集合的序列化以及泛型的高级用法。 十、JVM和性能优化 深入理解JVM内存模型、垃圾回收机制,以及如何进行性能分析和调优,是成为一名优秀Java开发者的必修课。 以上只是...

    JAVA基础思维导图【xmind格式】.zip

    "28、java序列化.xmind"介绍了Java对象序列化的过程、接口以及如何实现序列化,这在进行数据持久化和网络传输时非常关键。 "29、java网络编程.xmind"可能涵盖了Socket编程、URL连接、输入输出流等内容,这些都是...

    java编成思想

    6. **输入/输出(I/O)系统**:Java的I/O系统支持对文件、网络、系统资源等多种数据源的读写操作,包括流的概念、缓冲区、序列化等。 7. **多线程**:Java内置了对多线程的支持,可以通过实现Runnable接口或继承...

    JAVA图形化界面银行家算法

    综上所述,JAVA图形化界面银行家算法项目是一个优秀的学习和教学工具,它将抽象的理论知识转化为直观的实践操作,对于理解操作系统中避免死锁的策略具有重要意义。通过这个项目,无论是初学者还是专业人士,都能更好...

Global site tag (gtag.js) - Google Analytics