Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.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思考》(第四版)。我不确定我是否能在不侵犯版权的情况下附上几张他的书的扫描图,但实际上我偶然发现了“对象序列化”一章中的最后一个例子(第715-718页)。通过io/StoreCADState.java和io/RecoverCADState.java,Eckel可以获得具有不同静态值的同一类的对象。他解释得不够深入,我感到完全困惑


我知道静态成员属于类而不是对象。虽然我现在不确定它的确切含义。我过去认为这意味着,每当创建一个对象时,就会从类描述中“获取”一组静态参数,并“添加”到对象中。如果这是正确的,那么当对象实例被强制转换到特定类时,为什么在反序列化后不将它们“添加”到对象中?

请查看Javadoc中的静态成员。它是这样说的:

它们与类相关联,而不是与任何对象相关联

由于
静态
成员从未与任何
对象关联
,因此在序列化
对象
时,它们从未被存储。另外,新的
对象
不会自动接收所有静态参数,因为它们与
对象的序列化反序列化无关。如果您试图用对象存储
静态
变量,那么我认为这是一个设计缺陷。如果我们想用对象持久化它们的值,我们应该将它们声明为非静态的

更新:


如果您想用对象存储不可序列化的字段,那么可以通过编写
readObject()
writeObject()
方法的实现来实现。例如,看看SO问题的答案。

看看Javadoc中的静态成员。它是这样说的:

它们与类相关联,而不是与任何对象相关联

由于
静态
成员从未与任何
对象关联
,因此在序列化
对象
时,它们从未被存储。另外,新的
对象
不会自动接收所有静态参数,因为它们与
对象的序列化反序列化无关。如果您试图用对象存储
静态
变量,那么我认为这是一个设计缺陷。如果我们想用对象持久化它们的值,我们应该将它们声明为非静态的

更新:


如果您想用对象存储不可序列化的字段,那么可以通过编写
readObject()
writeObject()
方法的实现来实现。例如,看一下SO问题的答案。

因为静态成员属于类而不是对象,所以默认情况下它们不会序列化或反序列化

静态成员中具有相同名称和不同值的类只能在另一个命名空间中(由另一个类加载器加载)


阅读本文以了解:

因为静态成员属于类,而不是对象,所以默认情况下它们不会序列化或反序列化

静态成员中具有相同名称和不同值的类只能在另一个命名空间中(由另一个类加载器加载)

阅读以下内容以了解:

序列化如何协调静态成员

没有

我不明白为什么在反序列化之后需要重新分配静态字段

你没有

(正如一些人建议的那样,以保持原始值)

他们错了

如果根据定义,同一类的所有对象都具有相同的静态参数值

对象根本没有静态参数的值。静态成员在类中,而不是在对象中

新对象是否会自动接收其类的所有静态参数

没有

我的意思是如果反序列化使对象的静态成员无效

没有

我们保留原始对象,这不意味着同一个类中会有两个静态参数值不同的对象吗

不,因为这不会发生

那怎么可能

事实并非如此

还是我错了

有几种方法。序列化对静态成员没有任何作用

编辑

看来我不够清楚,对此我很抱歉

你说得很清楚。你只是在几件事上犯了根本性的错误

在写我的第一句话时,我一直铭记着布鲁斯·埃克尔的《用Java思考》(第四版)。我不确定我是否能在不侵犯版权的情况下附上几张他的书的扫描图

你不能(不应该)在这里发布文本图像,但你可以引用“合理使用”条款下的一点书

但实际上,我偶然发现了“对象序列化”一章中的最后一个示例(第715-718页)。通过他的
io/StoreCADState.java
io/RecoverCADState.java
Eckel获取具有不同静态值的同一类对象

不可能。你一定误解了。或者他正在使用不同的类装入器,这是一个复杂的问题,而不是男人