声明
引用
原文出处: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、它就会去写关联这个实例的数据,从最小的超类到最大获得类
翻译中。。。。。。。。。。。。。。
分享到:
相关推荐
**FST:快速Java序列化的替代方案** 在Java开发中,序列化是一个常见的需求,它允许将对象的状态转换为字节流,以便于存储或网络传输。标准的Java序列化虽然方便,但在处理大量数据时,性能往往成为瓶颈。这时,FST...
Java序列化算法主要包括以下几个步骤: 1. **输出类元数据**:首先输出对象所属类的元数据,包括类名、父类名等信息。 2. **递归输出父类描述**:如果类有父类,则递归输出父类的描述信息,直到没有父类为止。 3. *...
在这个“Java快速序列化库”中,提到的“fst”是一个常见的标签,这可能是Fast-serialization的缩写,这是一个广受欢迎的高性能Java序列化库。FST(Fast Serialization Toolkit)设计目标就是解决Java原生序列化性能...
3. **常见的二进制序列化库**:在各种编程语言中,都有流行的二进制序列化库,例如Java的Java Object Serialization,C#的protobuf-net,Python的pickle,Go的protobuf等。 4. **Protocol Buffers (protobuf)**:由...
本资源摘要信息涵盖了Java高级面试题附答案汇总(2021年Java面试题及答案大全),涵盖了多个知识点,包括Java高级面试题、序列化、多线程同步、GC算法、集合类型、JDK自带的监控和性能分析工具等。 1. ...
3. **数据序列化与反序列化**:为了在网络中传输对象,Java提供了一种叫做序列化(Serialization)的过程,即将对象转换为字节流,便于在网络中传输。反序列化则是将字节流恢复为原来的对象。在聊天系统中,可能需要...
java笔试题算法分布式 Saga 库和示例 这是 Java 库的集合,它们构成了分布式传奇模式的实现。 这些库可用于构建具有明确定义的容错和恢复机制的分布式系统。 saga-samples 模块下的 polyglot-persistence 示例应用...
如并发(Concurrency)、统计数据(Statistics)、终止条件(Termination)、随机性(Randomness)、序列化(Serialization)和工具类(Utility classes)等,这些都是实现遗传算法过程中不可或缺的元素。...
7. **序列化(Serialization)**:在Java中,对象需要转化为字节流才能在网络间传输或持久化存储,因此序列化和反序列化是必不可少的。Java的标准序列化、Google的Protocol Buffers、Facebook的Thrift或Apache Avro...
为了提供保存和加载游戏进度的功能,开发者可能需要学习序列化(Serialization)技术,将游戏状态转换为字节流以便存储,然后在需要时反序列化恢复。 总结,Java五子棋项目涵盖了Java编程的多个方面,包括基本语法...
2. **序列化(Serialization)**:当需要将Java对象转换为XML时,Castor会根据映射文件将对象的属性转换为XML元素和属性。这个过程通常发生在对象实例需要持久化或者通过网络传输时。 3. **反序列化...
总结,"EQ"是一款用Java实现的局域网聊天系统,它利用Java的网络编程、多线程、序列化等技术,实现了高效的通信和友好的用户界面。通过对服务器端和客户端的有效管理,保证了局域网内的实时通讯,同时也注重了数据...
- **序列化的底层原理**: 如Java对象序列化规范(Serialization Protocol)。 - **序列化的安全性**: 序列化过程中可能存在的安全隐患。 **5. 泛型** - **类型擦除**: 泛型在编译时的处理方式。 - **通配符**: ? ...
3. **数据序列化与反序列化(Serialization & Deserialization)**:Java的`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`用于将对象序列化为字节流在网络上传输,然后在接收端反序列化恢复为原来的...
4. **序列化策略(Serialization Strategy)**:Gson 2.7可能包含了对序列化策略的改进,如只序列化对象的一部分属性,或者根据注解决定哪些字段应被包括在JSON中。 5. **泛型处理**:Gson在处理泛型类型时非常强大...
总之,"JAVA课程设计源码"是一个综合性的项目,它涵盖了Java编程的多个核心领域,包括网络编程、GUI设计、数据库操作、数据结构与算法、对象序列化以及文件I/O等。通过这个项目,学习者不仅能深入理解Java技术,还能...
5. **XML序列化(XML Serialization)**:JGraph支持将图形模型序列化为XML格式,方便保存和加载图形状态,这对于数据持久化和跨平台应用非常有用。 6. **性能优化**:JGraph设计时考虑了性能,尤其是在处理大量...
为了在程序关闭后仍能保留数据,系统需要将内存中的集合对象持久化到硬盘上,这通常通过序列化(Serialization)实现。当系统再次启动时,可以反序列化这些数据,恢复之前的状态。Java提供了ObjectOutputStream和...
坦克大战可能通过序列化(Serialization)将游戏状态保存到硬盘,或者使用XML、JSON等格式的文件来存储关卡信息。这样,玩家可以在下次启动游戏时继续之前的进度。 七、游戏逻辑 游戏逻辑是坦克大战的核心,包括...