`
healthandbeauty
  • 浏览: 164697 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

java 序列化(serialization)算法的透露

    博客分类:
  • java
阅读更多
声明
引用
原文出处:http://www.javaworld.com/community/node/2915
Submitted by javatips on Thu, 05/07/2009 - 15:28

序列化是将对象状态保存到字节队列的过程。
反序列化是:将这些字节队列转换为一个活生生对象的过程。java 序列化的api为开发者处理序列化提供了一套标准的方法。在这个话题中,你将看到将怎么去序列化一个对象。为什么有时候序列化是必须的呢?你将学习到序列化算法在java中的应用,紧接着你将看到一个被编排序列化的并且有插图的对象。你到目前为至你应该对序列化算法的工作和实体被序列化(作为对象的一部分)有一点了解吧

为什么序列化是必须的
在今天的这个世界上,一个有代表性的公司有很多各种各样的组件,在分布式系统之间和网络之间交互。在java中一切都由对象来表示,如果java中的两个组件之间想互相交流,需要一种方法去交换数据,第一种方法是定义你的协议去转换对象,意思就是接受者根据这条协议知道这是发送者创建的对象,若是第三个组件加入进来就比较困难了。因此这儿需要一个通用的并且效率高组件之间的对象转换协议,序列化的定义就是为了这个目的,java组件就是用这个协议来实现对象之间的转换。
图一:显示了一个客户端和服务器端之间交流高级视图,这有一个通过序列化实现客户端到服务器端对象之间的转换。

怎么去序列化一个对象
目的是序列化一个对象,首先你要确定类对象实现了java.io.Serializable借口如下列表
Listing 1. Implementing Serializable
class TestSerial implements Serializable {	
     public byte version = 100;
     public byte count = 0;
}

在listing1中你必须做的不同的是创建一个实现java.io.Serializable接口的正常类。这个接口就是一个标记性借口哦,此接口断言根本没有任何方法,表明实现此接口的类将被序列化。

现在你已经创建了一个合格并且序列化的类,下一步是真正的去序列化这个对象,那就是调用java.io.ObjectOutputStream类的writeObject()方法,如下listing2
Listing 2. Calling writeObject()
public static void main(String args[]) throws IOException {	
   FileOutputStream fos = new FileOutputStream("temp.out");
   ObjectOutputStream oos = new ObjectOutputStream(fos);	
   TestSerial ts = new TestSerial();	
  oos.writeObject(ts);	
  oos.flush();	
  oos.close();
}


在一个文件中listing2中存储的TestSerial 对象状态,被temp.out.oos.writeObject(ts);方法调用,实际上是踢出了序列化算法,这个算法循环把对象写到temp.out
在序列化文件里面重新创建对象,你需要雇用以下listing3的代码
Listing 3 recreating a serialized object
public static void main(String args[]) throws IOException {
  FileInputStream fis = new FileInputStream("temp.out");	
  ObjectInputStream oin = new ObjectInputStream(fis);	
  TestSerial ts = (TestSerial) oin.readObject();
  System.out.println("version="+ts.version);
}

在listing3 中调用oin.readObject();方法,对象的原型就会被复原,这个方法读取我们先前创建活生生元素对象的复制品的对象的字节,因为readObject()能够读取任何序列化对象,一个塑造对象的类型是必要的。执行这段代码将在控制台输出version=100;

一个序列化格式的对象
序列化形式的对象看起来像什么呢?回忆一下,在前面段落的简单代码保存了序列化形式的TestSerial的对象到temp.out。listing 4显示了temp.out的内容,十六进制显示(你需要一个十六进制的编辑器去查看这些输出的十六进制)
listing 4 TestSerial对象的十六进制形式如下:

AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 6573 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 0563 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 7870 00 64


如果你不太喜欢真实的TestSerial对象,那你就看只有两种类型的数字,listing 5 如下

  public byte version = 100;	
  public byte count = 0;


一个byte类型变量的大小是 1 byte,因此总大小是2个字节,不过你要是在listing 4 中看序列化对象的大小的话,那就是51个字节。令人惊讶的是这些额外的字节是在那里来的,他们存在的意义又是什么,他们是通过序列化算法生产出来的额,目的就是重新创建对象,在接下里的章节,你认真研究一下这些细节中的算法

java 序列化算法

到目前为之你应该对对怎么去序列化一个对象有了一个很好的了解,那这个过程是怎么进行的?如下是一个通用的序列化算法。
1.它写出了类对象内部的元数据
2、它递归地写出了从超级类到java.lang.Object 的描述。
3、一旦到它写完了元数据的信息,紧接着它就启动关联实例的真实数据,不过在此时,它的启动来源与最顶层的超级类。
4、它就会去写关联这个实例的数据,从最小的超类到最大获得类




翻译中。。。。。。。。。。。。。。
0
0
分享到:
评论

相关推荐

    序列化和反序列化 Serialization

    数据的序列化和反序列化 Serialization DeSerialization

    Java序列化的机制和原理

    Serialization(序列化)是一种将对象以一连串的字节描述的...在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。……

    探讨和比较Java和.NET的序列化(Serialization)框架

    探讨和比较Java和.NET的序列化(Serialization)框架

    java-Hadoop序列化

     序列化(Serialization)是指把结构化对象转化为字节流。  反序列化(Deserialization)是序列化的逆过程。即把字节流转回结构化对象。  Java序列化(java.io.Serializable)  Hadoop序列化的特点  ...

    详解Java 序列化与反序列化(Serialization)

    主要介绍了Java 序列化与反序列化(Serialization),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java序列化(Serialization) 机制

    本篇文章是对Java中对象的序列化(Serialization) 机制进行了详细的分析介绍,并附实例,需要的朋友可以参考下

    java 对象序列化

    java 序列化对象 MARSHALLING UNMARSHALLING

    Java序列化与反序列化三种格式存取

     Java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输、或者持久化存储到数据库或文件系统中;然后在需要的时候,可以根据字节流中的信息来重构一个...

    C#对象序列化与反序列化

    二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。 SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以...

    深入浅析Java Object Serialization与 Hadoop 序列化

    序列化是指将结构化对象转化为字节流以便在网络上传输或者写到磁盘永久存储的过程。下面通过本文给大家分享Java Object Serialization与 Hadoop 序列化,需要的朋友可以参考下

    C++11 下使用 Boost.Serialization 库实现智能指针的序列化

    C++11 下使用 Boost.Serialization 库实现智能指针的序列化

    Java_serialization_doc.rar_Serializable _doc_序列化

    Java中对象的序列化(serialization)允许把采用Serializable接口的任何对象转换成字节流序列;同时它也允许把字节流序列转换回对象本身。其机制不依赖于操作系统,也就是说,你可以通过网络传递该对象,并在网络...

    akka-kryo-serialization, 基于Kryo的Akka序列化.zip

    akka-kryo-serialization, 基于Kryo的Akka序列化 akka-kryo-serialization-- Scala 和Akka基于kryo的序列化程序这个库为 Scala 和Akka提供定制的基于kryo的序列化程序。 它可以用于更高效的akka远程处理。它还可以...

    序列化(Serialization)

    NULL 博文链接:https://mindfocus.iteye.com/blog/938415

    对象序列化:使用System.Xml.Serialization命名空间

    要使用.NET进行对象的序列化,必须在解决方案中添加System.Xml的引用,并且在类文件中引入System.Xml.Serialization命名空间。这样就可以在文件中使用序列化所需要的各种特性了。 Imports System.Xml....

    delphi 序列化

    序列化 (serialization):将对象的状态信息转换为可以存储或传输的形式的过程。 与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。 序列化的目的  1、以某种存储形式使...

    Java对象的序列化与反序列化

     序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等。在网络传输过程中,可以是字节或是XML等格式。而字节的或XML编码...

    jackson-serialization-examples:常用的Java JSON序列化示例

    序列化 杰克逊-序列化字符串 Jackson-将字符串序列化为JSON对象 Jackson-序列化字符串列表 杰克逊–序列化字符串映射 Jackson-序列化String Wrapper类 Jackson-使用LocalDate序列化对象(默认) Jackson-使用ISO...

    java Streams and Serialization 详解

    详细讲解了java各种输入输出流(stream),以及serialization和externalization的用法与关系

Global site tag (gtag.js) - Google Analytics