为什么实现Externalizable需要一个默认的公共构造函数?
如果我们实现Serializable,我们不需要它。 为什么这个差异呢? 它与序列化的实际机制有什么关系?
可以在http://www.jusfortechies.com/java/core-java/externalization.php上找到详尽的解释(尽管可能会改进文章的语法)。 简短的回答,以供将来参考,以防链接页面消失:
Externalizable是一个扩展Serializable的接口。 但是,与Serializable相反,只是读取序列化的字节流不会恢复对象,但会调用公共构造函数,只有在创建了对象后,才会恢复其状态。 这使得恢复更有效。
编辑:另请参阅Java中的Serializable和Externalizable有什么区别? 。
这主要用于缓存目的。 为了反序列化流,你需要说明你希望如何反序列化对象,因此Externalizable
接口中的合同提供了两种方法: writeExternal
和readExternal
。 请注意, Externalizable
扩展了Serializable
,因此您不一定需要实现Serializable
接口(尽管它是一个标记接口,并且没有实际实现的方法)。
有关示例实现,请查看MimeType 。
使用Externalizable接口时需要公共的无参数构造函数。
因为在Serializable的情况下
- readObject从ObjectInputStream中读取所需的信息
- 序列化使用reflection机制来获取必要的字段及其相应的值。
- Serializable序列化所有数据成员(静态和瞬态除外)。
但在Externalizable的情况下
- 没有使用reflection机制。
- 用户不会序列化所有数据成员。这就是为什么要获取未外部化的成员的值,不需要arg构造函数。
- LDAP:错误代码50 – 由于访问权限不足,无法添加条目uid = test @ info.com,ou = People,o = Drive,dc = company,dc = com
- 为Palindrome创建一个递归方法
- Java ArrayList:contains()方法在arraylist包含给定对象时返回false
- 在jsp中使用foreach显示列表中的列表
- java tomcat6 – 如何在添加数据时自动刷新页面?
- 当Tomcat加载和读取beans.xml时,为什么没有正确加载Spring AOP XML模式
- 通过jSoup从Div标签获取属性值
- 如何在java中生成XML(在String表示中)
- 如何使用mockMvc检查响应体中的JSON