Java 序列化如何协调静态成员?
作为一个新手,我试图理解序列化,我不明白为什么在反序列化后需要重新分配静态字段(正如一些人建议的那样,以保持原始值),如果根据定义,同一类的所有对象都具有相同的静态参数值。新对象是否会自动接收其类的所有静态参数?我的意思是,如果反序列化使对象的静态成员为空,而我们保留原始对象,这不意味着同一类中会有两个静态参数值不同的对象吗?这怎么可能?我怎么错了 编辑: 看来我不够清楚,对此我很抱歉 在写我的第一句话时,我一直铭记着布鲁斯·埃克尔的《用Java思考》(第四版)。我不确定我是否能在不侵犯版权的情况下附上几张他的书的扫描图,但实际上我偶然发现了“对象序列化”一章中的最后一个例子(第715-718页)。通过io/StoreCADState.java和io/RecoverCADState.java,Eckel可以获得具有不同静态值的同一类的对象。他解释得不够深入,我感到完全困惑Java 序列化如何协调静态成员?,java,serialization,Java,Serialization,作为一个新手,我试图理解序列化,我不明白为什么在反序列化后需要重新分配静态字段(正如一些人建议的那样,以保持原始值),如果根据定义,同一类的所有对象都具有相同的静态参数值。新对象是否会自动接收其类的所有静态参数?我的意思是,如果反序列化使对象的静态成员为空,而我们保留原始对象,这不意味着同一类中会有两个静态参数值不同的对象吗?这怎么可能?我怎么错了 编辑: 看来我不够清楚,对此我很抱歉 在写我的第一句话时,我一直铭记着布鲁斯·埃克尔的《用Java思考》(第四版)。我不确定我是否能在不侵犯版权的情
我知道静态成员属于类而不是对象。虽然我现在不确定它的确切含义。我过去认为这意味着,每当创建一个对象时,就会从类描述中“获取”一组静态参数,并“添加”到对象中。如果这是正确的,那么当对象实例被强制转换到特定类时,为什么在反序列化后不将它们“添加”到对象中?请查看Javadoc中的静态成员。它是这样说的: 它们与类相关联,而不是与任何对象相关联 由于
静态
成员从未与任何对象关联
,因此在序列化对象
时,它们从未被存储。另外,新的对象
不会自动接收所有静态参数,因为它们与对象的序列化反序列化无关。如果您试图用对象存储静态变量,那么我认为这是一个设计缺陷。如果我们想用对象持久化它们的值,我们应该将它们声明为非静态的
更新:
如果您想用对象存储不可序列化的字段,那么可以通过编写readObject()
和writeObject()
方法的实现来实现。例如,看看SO问题的答案。看看Javadoc中的静态成员。它是这样说的:
它们与类相关联,而不是与任何对象相关联
由于静态
成员从未与任何对象关联
,因此在序列化对象
时,它们从未被存储。另外,新的对象
不会自动接收所有静态参数,因为它们与对象的序列化反序列化无关。如果您试图用对象存储静态变量,那么我认为这是一个设计缺陷。如果我们想用对象持久化它们的值,我们应该将它们声明为非静态的
更新:
如果您想用对象存储不可序列化的字段,那么可以通过编写readObject()
和writeObject()
方法的实现来实现。例如,看一下SO问题的答案。因为静态成员属于类而不是对象,所以默认情况下它们不会序列化或反序列化
静态成员中具有相同名称和不同值的类只能在另一个命名空间中(由另一个类加载器加载)
阅读本文以了解:因为静态成员属于类,而不是对象,所以默认情况下它们不会序列化或反序列化
静态成员中具有相同名称和不同值的类只能在另一个命名空间中(由另一个类加载器加载)
阅读以下内容以了解:
序列化如何协调静态成员
没有
我不明白为什么在反序列化之后需要重新分配静态字段
你没有
(正如一些人建议的那样,以保持原始值)
他们错了
如果根据定义,同一类的所有对象都具有相同的静态参数值
对象根本没有静态参数的值。静态成员在类中,而不是在对象中
新对象是否会自动接收其类的所有静态参数
没有
我的意思是如果反序列化使对象的静态成员无效
没有
我们保留原始对象,这不意味着同一个类中会有两个静态参数值不同的对象吗
不,因为这不会发生
那怎么可能
事实并非如此
还是我错了
有几种方法。序列化对静态成员没有任何作用
编辑
看来我不够清楚,对此我很抱歉
你说得很清楚。你只是在几件事上犯了根本性的错误
在写我的第一句话时,我一直铭记着布鲁斯·埃克尔的《用Java思考》(第四版)。我不确定我是否能在不侵犯版权的情况下附上几张他的书的扫描图
你不能(不应该)在这里发布文本图像,但你可以引用“合理使用”条款下的一点书
但实际上,我偶然发现了“对象序列化”一章中的最后一个示例(第715-718页)。通过他的io/StoreCADState.java
和io/RecoverCADState.java
Eckel获取具有不同静态值的同一类对象
不可能。你一定误解了。或者他正在使用不同的类装入器,这是一个复杂的问题,而不是男人