所谓对象序列化就是将对象的状态转换成字节流,以后可以通过这些值再生成相同状态的对象。这个过程也可以通过网络实现,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新“装配”。是不是很神奇。
也许你会说,只了解一点点,但从来没有接触过,其实未必如此。RMI、Socket、JMS、EJB你总该用过一种吧,彼此为什么能够传递Java对象,当然都是对象序列化机制的功劳。
第一次使用Java的对象序列化是做XXX项目(其实我也只使用过这一次,千万别扔什么蔬菜、水果^_*),当时要求把几棵非常复杂的树(JTree)及相应的数据保存下来(就是我们常用的保存功能),以便下次运行程序时可以继续上次的操作。那时XML技术在网上非常的热,而且功能也强大,再加上树的结构本来就和XML存储数据的格式很像。作为一项对新技术比较有兴趣的我当然很想尝试一下。不过经过仔细分析,发现如果采用XML保存数据,后果真是难以想象:哪棵树的哪个节点被展开、展开到第几级、节点当前的属性是什么。真是不知该用A、B、C还是用1、2、3来表示。还好,发现了Java的对象序列化机制,问题迎刃而解,只需简单的将每棵树的根节点序列化保存到硬盘上,下次再通过反序列化后的根节点就可以轻松的构造出和原来一模一样的树来。
其实保存数据,尤其是复杂数据的保存正是对象序列化的典型应用。最近YYY项目就遇到了需要对非常复杂的数据进行存取,通过使用对象的序列化,问题同样化难为简。
对象的序列化还有另一个容易被大家忽略的功能就是对象复制(Clone),Java中通过Clone机制可以复制大部分的对象,但是众所周知,Clone有深层Clone和浅层Clone,如果你的对象非常非常复杂,假设有个100层的Collection(夸张了点),如果你想实现深层Clone,真是不敢想象,如果使用序列化,不会超过10行代码就可以解决。还有就是Swing组件,如果你有两个很象很象(或是一模一样)的比较难以构造的Swing组件,你该怎么办,也许你想到了Clone,但是偏偏Java 善(Sun)弄人,Swing组件没有提供Clone方法。别急,使用序列化,6行代码搞定,
QUOTE:
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteOut);
out.writeObject(combo);
ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
ObjectInputStream in =new ObjectInputStream(byteIn);
JComboBox comb2 = (JComboBox)in.readObject();
如果你决得还不过瘾,那2行代码也能搞定,一行代码行不?好像不行!
虽然Java的序列化非常简单、强大,但是要用好,还有很多地方需要注意。比如曾经序列化了一个对象,可由于某种原因,该类做了一点点改动,然后重新被编译,那么这时反序列化刚才的对象,将会出现异常。你可以通过添加serialVersionUID属性来解决这个问题。如果你的类是个单态(Singleton)类,是否允许用户通过序列化机制复制该类,如果不允许你需要谨慎对待该类的实现。
分享到:
相关推荐
在Java中,我们可以利用文件I/O来保存和读取玩家进度,如使用序列化(Serialization)技术将游戏对象的状态写入文件,或者使用JSON库如Gson来存储和恢复数据。 总的来说,"ZombieCrisis"作为一个JAVA射击生存类小...
这通常涉及到序列化和反序列化技术,将游戏状态转化为数据存储。 8. **音效与图形**:为了提升游戏体验,开发者会集成音效和图形资源。Java允许使用第三方库如JLayer处理音频,而图像则可以通过Java 2D API进行渲染...
6. **数据序列化与反序列化**:在网络传输中,游戏状态需要被序列化为字节流,然后在服务器和客户端之间传输。Java提供了Serializable接口和ObjectOutputStream/ObjectInputStream类来实现这一过程。 7. **设计模式...
这对于实现元编程、插件系统和序列化等高级功能非常有用。 9. **compare**:在Java中,compare可能指的是Comparable接口或Comparator接口的方法。这两个接口用于实现对象的比较,是排序算法(如Collections.sort()...
总的来说,XStream 1.4.3是Java开发中的一个强大工具,它简化了对象序列化的过程,使得Java Bean到XML或JSON的转换变得轻而易举。无论是在存储数据、构建RESTful API还是解析配置文件,XStream都能提供简洁、高效的...
4. **序列化与反序列化**:在程序中创建对象,设置字段值,然后调用序列化方法将其转换为字节流。接收端则可以使用反序列化方法将接收到的字节流还原成对象。 三、优点 1. **高效**:Protobuf的二进制格式比XML、...
开发者可能利用Java的序列化或JSON解析库,将游戏状态转化为可读写的数据文件,使得玩家可以随时存档和继续游戏。 最后,考虑到游戏的调试和优化,开发者会编写测试用例,使用Java的JUnit框架进行单元测试,确保...
Java提供了序列化机制,可以将游戏状态转化为二进制流进行持久化存储。 7. **用户界面**:用户界面是玩家与游戏交互的窗口。JavaFX或Swing库可以帮助开发者创建美观且功能丰富的UI,包括菜单、对话框、状态栏等。 ...
Java是一种跨平台的面向对象的语言,具有良好的内存管理机制(垃圾回收)和强大的类库支持。它的性能在近年来得到了显著提升,尤其是通过JavaFX和JMonkeyEngine等专业游戏开发框架,使得Java成为制作2D和3D游戏的...
总之,"weapon-animation-replacer"是一个展示Java在游戏开发中强大能力的例子,它利用Java的灵活性和强大的类库来实现复杂的动画替换功能。通过理解这一工具的工作原理,开发者可以更好地掌握Java在游戏领域的应用...
这项技术的核心在于通过将临时数据序列化并存储在磁盘上,而非全部加载到内存中,从而优化了内存消耗,有效防止了因内存不足而导致的应用程序崩溃。报告虚拟化技术的具体实现,可以通过以下步骤进行: #### 1. 创建...
Chronicle-Algorithms提供了直接读取和写入原始字节的方法,这在处理协议解析、序列化和反序列化等场景下尤其有用。 最后,我们简要介绍一下堆外锁定(Off-heap locking)。传统的Java内存模型主要依赖于JVM的堆...
为了优化性能和减少延迟,开发者可能还采用了如Protobuf或JSON等轻量级序列化工具来编码和解码网络数据。 除此之外,Java库如LWJGL( Lightweight Java Game Library)或者JavaFX可以用于图形界面的开发,提供丰富...
首先,Java作为一种面向对象的语言,其强大的类库支持和跨平台能力是项目开发的基础。在"projectradon"中,开发者可能通过定义不同的类来实现游戏中的角色、敌人、武器、地图等元素,每个类都封装了各自的行为和属性...
在软件开发过程中,UML(统一建模语言)是一种强大的工具,它为开发者提供了一种可视化的方式来描述、构建和文档化软件系统。UML设计工具Smarcha便是这样一款专为此目的而生的应用,它简化了UML模型的创建过程,极大...
C#的序列化功能使得游戏数据(如玩家进度、世界状态)能够被保存到磁盘并重新加载。Unity的PlayerPrefs类提供了一种简单的方法来存储玩家特定的设置和数据。 八、UI系统与事件驱动编程 Unity的UI系统基于Canvas和...
Python是一种广泛使用的高级编程语言,以其易读性、简洁性和强大的功能而闻名。"Python基础知识"是学习这个语言的...无论你是打算从事数据分析、Web开发还是自动化任务,Python基础知识都会是你成功路上的强大武器。
9. **存档系统**:游戏进度的保存和读取是必不可少的,可能采用序列化技术将游戏状态转化为文件存储。 10. **UI界面**:用户界面是玩家与游戏交互的主要途径,包括菜单、地图、状态栏等。Java的Swing或JavaFX库可以...
这可能涉及序列化技术,将游戏状态转换为文件,以便于读取和恢复。 【调试与测试】 在开发过程中,开发者会使用日志、断点、单元测试等工具进行调试,确保代码质量和游戏稳定性。" Earnest"可能还有专门的测试框架...
在RPG Maker中,用户通过可视化编辑器来构建地图、创建角色、编写脚本,而ForgE则试图用类似的方式,让开发者或非程序员也能快速上手。这通常包括地图编辑器、事件系统、角色和物品管理等功能。 地图编辑器是 ForgE...