繁体   English   中英

java可序列化接口

[英]java serializable interface

在Java中,有些对象是可序列化的,有些对象是可序列化的。实现序列化接口的类的对象可以充当可序列化的对象。另外,可序列化接口仅用于同名,那里没有方法。这里我的问题是Java规范可以简单地说所有对象都是可序列化的。用户不需要为此目的实现任何接口,但是它没有这样指定,那么它的目的是什么?

在这里我不是在问为什么我们需要Serializable接口?

为什么我需要将此信息(即给定的对象是可序列化的对象)传达给开发人员和编译器/ JVM?

大概是因为这迫使开发人员考虑序列化是如何发生的。 那里有两个不平凡的问题,例如维护单例对象的对象标识,要序列化的状态(该字段应该是瞬态的吗?如果是,在反序列化之后如何初始化它)和版本控制。

此外,实现Serializable具有安全隐患。 尽管虚拟机确保不能修改私有字段(至少在存在安全管理器的情况下),但对于序列化数据没有这种保护。

此链接有一些原因。 我认为基本原理是标记接口(即没有方法)真正将信息传达给开发人员和编译器/ JVM。

编辑:我开始写评论以回应第一个评论,但决定编辑答案。

该链接列出了您可能不希望对象可序列化的3个原因:(a)序列化状态可能没有意义(b)额外的合同/版本管理开销(c)隐私问题。 编译器无法提前知道这些问题。

有人可能会问:“为什么序列化不是默认设置,并且有一种选择退出的方式?”。 答案可能是(1)用语言表达奇怪(2)更危险。 对于(2)的示例,如果您不了解隐私问题(c),那么您可能会暴露敏感信息而没有明确表明这样做。

这是一个真实的示例:体面的应用服务器可以在必须关闭或重新启动服务器时将会话数据(特别是HttpSession的属性)临时存储在磁盘上,以便它可以在启动时恢复所有会话数据。 在集群环境中,appserver还将会话数据写入磁盘,以便可以在集群中的appserver之间共享它。

将Java对象(通常只是javabeans)写入磁盘要求它们实现java.io.Serializable (这只是一个标记接口 )。 Rougly表示,通过实现该接口,开发人员可以授予JVM将该数据存储在磁盘文件系统上的权限。 但这也意味着上下文之外的任何其他内容都可以访问此数据。

如果实现序列化的类包含一个您不想存储在磁盘文件系统上的字段,例如, private String password (不好的例子,但是应该可以告诉您),那么您可以声明它为transient以避免其值被序列化到磁盘上:

private transient String password;

您只需忍受反序列化后将无法恢复其原始值这一事实。 您必须编写其他逻辑才能自己恢复其价值。 标记为static字段也不会被序列化,但是它们通常在加载类时已被初始化。

希望这能提供清晰的画面。

  1. 使用序列化概念,可以将对象暴露在jvm之外,而将对象暴露给私有变量,这违反了OOPS概念。 通过将类标记为可序列化,开发人员可以了解安全问题。
  2. JVM序列化完整的对象导航图。 有时,开发人员可能打算仅保留顶级对象,而忘记将成员变量标记为瞬态。 在这种情况下,可序列化接口强制开发人员对持久性必需的类做出有意识的决策。

http://webmoli.com/2008/01/27/what-is-the-magic-serializable-interface-does-in-java/

在注释之外的语言中存在注释之前,请将Serializable接口视为第一个Java注释。 当他们编写java.io. *时,他们没有注释。 如果他们今天重写了它,那么将不会有Seri​​alizable接口,但是会有一个注释执行相同的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM