Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java可序列化接口_Java_Serialization - Fatal编程技术网

java可序列化接口

java可序列化接口,java,serialization,Java,Serialization,在Java中,有些对象是可序列化的,有些是可序列化的,有些是不可序列化的。实现可序列化接口的类的对象可以充当可序列化对象。此外,可序列化接口仅用于同名对象,没有方法。我的问题是,Java规范可以简单地说所有对象都是可序列化的。用户不需要为此实现任何接口。但它没有这样指定。那么这背后的目的是什么 这里我不是在问为什么我们需要可序列化接口 为什么我需要将这些信息(即,给定的对象是可序列化的)传递给开发人员和编译器/JVM?有一些原因。我认为基本原理是标记接口(即没有方法)真正地将信息传递给开发人员和

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

这里我不是在问为什么我们需要可序列化接口

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

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

编辑:我开始写一条评论来回应第一条评论,但决定编辑答案

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

有人可能会问:“为什么序列化不是默认设置,有一种方法可以选择退出?”。这里的答案可能是:(1)用语言表达很奇怪(2)更危险。以(2)为例,如果您不知道隐私问题(c),那么您可能会公开敏感信息,并明确表示不知道。

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

编辑:我开始写一条评论来回应第一条评论,但决定编辑答案

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


有人可能会问:“为什么序列化不是默认设置,有一种方法可以选择退出?”。这里的答案可能是:(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
(错误的示例,但它应该为您提供