`
kyleliu
  • 浏览: 28568 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Serializable 使用心得

阅读更多

1. writeObject和readObject必须是private的, 否则不会被调用.

2. Object的field的读写顺序, 遵循先进先出的原则.

3. 从ObjectInputStream中读Object的原理是: 先从流中读出每个元素的类型, 例如是数组, String还是Object等, 如果是Object, 就继续从流中读取这个类的描述信息, load这个类, 然后取这个类的第一个非Serializable的父类的public无参数构造函数, 通过构造函数创建实例, 最后调用readObject或defaultReadObject为这个实例赋值.

4. 从3可以看出, 在从ObjectInputStream中读出的Object时,和写进去的不是同一个Object。

5. 不用怀疑, JVM有办法调用你的类的private方法和父类的default构造函数.

6. 序列化写一个类的object, 序列化读的程序的classpath中也要有这个类, 否则读时跑出ClassNotFound.

7. 序列化的这个类的第一个非Serializable的父类, 必须有一个public的, 无参数的构造函数.

8. 具体细节可以参考JDK源码中的java.io.ObjectInputStream和java.io.ObjectStreamClass.

9. 总之, 序列化读就是创建一个空Obejct, 然后通过readObject赋值的过程.

10. 默认的序列化,会同时序列化static的field,就如同普通的field一样。

11. 序列化写时,同一个对象,2次写入,不论是直接写入,还是做为其他object的一个成员变量被连带写入的,实际上只是写了一次,另一次只是在stream做了一个标记。序列化读时,读2次,返回的实际上也是一个对象。

12. 将2个互相引用的对象序列化,根据上面的一个对象只会被序列化一次的原则,因此实际上这2个对象也只是分别被写入一次。

13. 向ObjectOutputStream中写一个Object,却从ObjectInputStream中连续读两次,第二次出EOFException.

14. 只有写时用了writeInt等方法,读时才能用readInt,否则出EOFException。

15. Externalizable与Serializable不同,其反序列化时,会通过这个类的默认构造函数来构造实例,随后再调用readExternal,因此如果这个类没有默认构造函数,或默认构造函数不是public的,那么,就会出异常。

分享到:
评论

相关推荐

    学习 WINFORM 以及 WPF 的心得

    作者定义了一个类来保存笔迹信息的集合,并且使用 [Serializable()] 来解决未模式化的问题。 图片拖拽 作者还实现了图片拖拽功能,首先定义了一个类来保存图片信息,然后使用 mousemove 事件来移动图片,并且使用 ...

    JavaRMI分布式编程心得

    - 使用 `Serializable` 或 `Externalizable` 接口实现自定义序列化逻辑。 2. **安全性考虑:** - RMI 默认不允许从远程客户端加载类。 - 使用 RMI 的安全性策略文件配置安全设置。 3. **性能优化:** - 考虑...

    用于记录在学习Mysql中的心得体会.zip

    隔离级别包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE),不同级别会带来不同的并发性和一致性效果。 视图是虚拟表,基于一个或多个表的...

    Java实习报告——山寨QQ聊天工具设计

    2. **网络编程**:使用Socket进行网络通信,使得用户可以在不同的计算机上进行聊天。 3. **I/O流**:处理输入和输出,如读取用户输入、发送和接收聊天消息。 4. **数据结构**:可能采用了如ArrayList来存储用户信息...

    MySQL事务的基础学习以及心得分享

    - SERIALIZABLE(串行化):最高的隔离级别,如同操作顺序执行,防止所有并发问题,但效率最低。 4. 持久性(Durability):一旦事务提交,其结果将永久保存,即使在系统故障后也能恢复。 事务的并发访问问题包括...

    Java企业级开发综合技能知识总结

    - 使用`Calendar`类计算昨天的日期,并使用`SimpleDateFormat`格式化输出。 18. **文件读写,实现一个计数器** - 使用`FileReader`和`FileWriter`类进行文件读写操作,记录和更新计数器的值。 19. **指出下面程序...

    安卓实验报告

    对于复杂数据类型,如自定义对象,可能需要实现Serializable或Parcelable接口。 6. **Activity堆栈管理**:Android系统采用“后进先出”(LIFO)的Activity堆栈管理方式,新启动的Activity被压入栈顶,用户回退时,...

    v2ex_flutter:使用Flutter SDK构建的www.v2ex.com演示应用程序

    V2EX API通常返回JSON格式的数据,因此开发者需要使用`json_serializable`库进行序列化和反序列化,以便在 Dart 对象间转换数据。 对于数据存储,Flutter提供了多种解决方案,如`shared_preferences`用于轻量级的...

    JAVA记忆测试程序设计报告

    JAVA记忆测试程序设计报告 ...六、系统设计总结心得 * 记忆测试系统的设计,强调了游戏的交互性和趣味性 * 系统的设计也强调了游戏的难度递进和挑战性 * 系统的设计最终目标是提高测试者的记忆能力和游戏体验

    java的学生信息管理系统

    - **接口和方法实现**:可能定义了接口以规范不同组件间的数据交换,例如`Serializable`接口用于数据持久化到文件,而具体的方法实现如`save()`、`load()`则对应数据的保存和读取。 - **线程应用**:如果系统需要...

    Java和scala实现 Spark RDD转换成DataFrame的两种方法小结

    在本文中,我们将讨论如何使用 Java 和 Scala 将 Spark RDD 转换成 DataFrame,並且介绍两种实现方法。 准备数据源 在项目下新建一个 student.txt 文件,内容如下: 1,zhangsan,20 2,lisi,21 3,wanger,19 4,...

    序列化和反序列化doc文档.rar

    在Java中,我们可以通过实现`Serializable`接口来标记一个类为可序列化的;在Python中,可以使用pickle或者json模块进行序列化操作。 反序列化则恰恰相反,它是将序列化后的数据恢复为原来的对象状态。这个过程需要...

    java.awt.container源码中的组合设计模式

    最近学了下组合设计模式,很有心得,于是看了一些java中的用到组合设计的源码。再此分享给大家。 java.awt.container #add(component) 是使用的组合设计模式。下面上两个类的代码。 public abstract class Component...

    hibernate 开发指南下载

    文档内容不仅涵盖了Hibernate的基本使用方法,还融入了作者在实际项目中的经验积累以及与Hibernate官方论坛中多位技术专家的交流心得。 #### 二、目的与定位 本文档并非旨在取代Hibernate官方参考手册(Hibernate ...

    Hibernate_DEV_GUIDE

    本文档主要介绍了Hibernate的使用方法和技术要点,不仅涵盖了Hibernate的基础知识,还融入了作者的实际工作经验及在官方论坛与其他技术专家交流的心得。作者强调本文并不是要取代Hibernate官方参考文档,而是旨在为...

Global site tag (gtag.js) - Google Analytics