java可序列化接口
在Java中,有些对象是可序列化的,有些是可序列化的,有些是不可序列化的。实现可序列化接口的类的对象可以充当可序列化对象。此外,可序列化接口仅用于同名对象,没有方法。我的问题是,Java规范可以简单地说所有对象都是可序列化的。用户不需要为此实现任何接口。但它没有这样指定。那么这背后的目的是什么 这里我不是在问为什么我们需要可序列化接口 为什么我需要将这些信息(即,给定的对象是可序列化的)传递给开发人员和编译器/JVM?有一些原因。我认为基本原理是标记接口(即没有方法)真正地将信息传递给开发人员和编译器/JVM 编辑:我开始写一条评论来回应第一条评论,但决定编辑答案 该链接列出了不希望对象可序列化的3个原因:(a)序列化状态可能没有意义(b)额外的契约/版本控制开销(c)隐私问题。编译器无法提前知道这些问题 有人可能会问:“为什么序列化不是默认设置,有一种方法可以选择退出?”。这里的答案可能是:(1)用语言表达很奇怪(2)更危险。以(2)为例,如果您不知道隐私问题(c),那么您可能会公开敏感信息,并明确表示不知道。有一些原因。我认为基本原理是标记接口(即没有方法)真正地将信息传递给开发人员和编译器/JVM 编辑:我开始写一条评论来回应第一条评论,但决定编辑答案 该链接列出了不希望对象可序列化的3个原因:(a)序列化状态可能没有意义(b)额外的契约/版本控制开销(c)隐私问题。编译器无法提前知道这些问题java可序列化接口,java,serialization,Java,Serialization,在Java中,有些对象是可序列化的,有些是可序列化的,有些是不可序列化的。实现可序列化接口的类的对象可以充当可序列化对象。此外,可序列化接口仅用于同名对象,没有方法。我的问题是,Java规范可以简单地说所有对象都是可序列化的。用户不需要为此实现任何接口。但它没有这样指定。那么这背后的目的是什么 这里我不是在问为什么我们需要可序列化接口 为什么我需要将这些信息(即,给定的对象是可序列化的)传递给开发人员和编译器/JVM?有一些原因。我认为基本原理是标记接口(即没有方法)真正地将信息传递给开发人员和
有人可能会问:“为什么序列化不是默认设置,有一种方法可以选择退出?”。这里的答案可能是:(1)用语言表达很奇怪(2)更危险。以(2)为例,如果您不知道隐私问题(c),那么您可能会公开敏感信息,并明确表示不会这样做。可能是因为这会迫使开发人员考虑如何进行序列化。这里有两个非常重要的问题,例如维护单例对象的对象标识、要序列化的状态(该字段应该是瞬态的吗?如果是,反序列化后如何初始化?)和版本控制
此外,实现Serializable具有安全性影响。虽然虚拟机确保不能修改私有字段(至少在有安全管理器的情况下),但对序列化数据没有这样的保护。可能是因为它迫使开发人员考虑如何进行序列化。这里有两个非常重要的问题,例如维护单例对象的对象标识、要序列化的状态(该字段应该是瞬态的吗?如果是,反序列化后如何初始化?)和版本控制
此外,实现Serializable具有安全性影响。虽然虚拟机确保不能修改私有字段(至少在有安全管理器的情况下),但对序列化数据没有这样的保护。这里有一个真实的示例:体面的appservers可以临时存储会话数据(特别是
HttpSession
的属性)当服务器必须关闭或重新启动时,在磁盘上,以便在启动时恢复所有会话数据。在集群环境中,appserver还将会话数据写入磁盘,以便在集群中的appserver之间共享
将Java对象(通常只是JavaBean)写入磁盘需要它们实现Java.io.Serializable
(这只是一个简单的过程)。Rougly说,通过实现该接口,开发人员允许JVM将这些数据存储在磁盘文件系统中。但这也意味着上下文之外的任何东西都可以访问这些数据
如果实现serializable的类包含一个您不希望存储在磁盘文件系统中的字段,例如私有字符串密码
(这是一个坏例子,但它应该给您一个概念),那么您可以只声明它transient
,以避免将其值序列化到磁盘:
private transient String password;
您只需要接受这样一个事实,即在反序列化之后,它不会恢复为其原始值。您必须编写额外的逻辑来自己恢复其值。标记为static
的字段也不会被序列化,但它们通常在类的加载过程中已经被初始化
希望这能提供一个清晰的画面。这里有一个真实的示例:当服务器必须关闭或重新启动时,体面的appservers可以在磁盘上临时存储会话数据(特别是
HttpSession
),以便在启动时恢复所有会话数据。在集群环境中,appserver还将会话数据写入磁盘,以便在集群中的appserver之间共享
将Java对象(通常只是JavaBean)写入磁盘需要它们实现Java.io.Serializable
(这只是一个简单的过程)。Rougly说,通过实现该接口,开发人员允许JVM将这些数据存储在磁盘文件系统中。但这也意味着上下文之外的任何东西都可以访问这些数据
如果实现serializable的类包含一个您不希望存储在磁盘文件系统中的字段,例如private String password
(错误的示例,但它应该为您提供