静态变量序列化
情境:查看清单 2 的代码。
清单 2. 静态变量序列化问题代码
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
public static int staticVar = 5;
public static void main(String[] args) {
try {
//初始时staticVar为5
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("result.obj"));
out.writeObject(new Test());
out.close();
//序列化后修改为10
Test.staticVar = 10;
ObjectInputStream oin = new ObjectInputStream(new FileInputStream(
"result.obj"));
Test t = (Test) oin.readObject();
oin.close();
//再读取,通过t.staticVar打印新的值
System.out.println(t.staticVar);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
清单 2 中的 main 方法,将对象序列化后,修改静态变量的数值,再将序列化对象读取出来,然后通过读取出来的对象获得静态变量的数值并打印出来。依照清单 2,这个 System.out.println(t.staticVar) 语句输出的是 10 还是 5 呢?
最后的输出是 10,对于无法理解的读者认为,打印的 staticVar 是从读取的对象里获得的,应该是保存时的状态才对。之所以打印 10 的原因在于序列化时,并不保存静态变量,这其实比较容易理解,序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量。
分享到:
相关推荐
静态变量序列化 ---------------- 在 Java 序列化中,静态变量不会被序列化。这是因为静态变量是属于类的,而不是对象的。例如,清单 2 中,静态变量 staticVar 的值在序列化后被修改,但是读取对象时,静态变量的...
#### 静态变量序列化 通常认为,静态变量不属于对象状态的一部分,因此不会被序列化。但在某些情况下,序列化机制会保存静态字段的值,这主要取决于序列化过程的具体实现。为了防止不必要的序列化,可以通过在类...
**静态变量序列化**: Java序列化默认不会序列化类的静态变量,因为静态变量属于类而不是类的实例。这意味着,即使对象被序列化和反序列化,静态变量的值也不会受到影响。如果需要在序列化过程中包含静态变量,必须...
1. **对象状态的保存**:序列化会保存对象的所有实例变量的状态,但不会包括任何方法或静态变量。例如,对于一个`Box`对象,如果它有`width`和`height`两个实例变量,序列化时会保存这两个变量的值。 2. **元数据的...
使用Intent可以很方便在不同的Activity之间传递数据,这个也是官方推荐的方式,但是也有一定的局限性,就是Intent无法传递不能序列化的对象。我们可以使用静态变量来解决这个问题。在接受类中定义静态变量
1. **什么是序列化**:序列化是将对象的状态(属性和成员变量)转换为可以存储或传输的数据格式的过程。在Java中,通常是将对象转换为字节数组,以便写入磁盘或通过网络发送。 2. **为什么需要序列化**:序列化有...
在C#中,我们可以通过调用相应的序列化类的静态方法来完成这个过程。例如,如果我们使用XML序列化,我们可以调用XmlSerializer的Deserialize方法;如果使用JSON序列化,则可以调用JavaScriptSerializer的Deserialize...
因此,对象序列化不会关注类中的静态变量。 4. 序列化用户远程对象传输 除了在持久化对象时会用到对象序列化之外,当使用 RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。Java 序列化 API 为...
1. **序列化回调**:可以重写`writeObject()`和`readObject()`方法来自定义序列化和反序列化的行为,例如处理静态字段、处理特定逻辑等。 2. ** serialVersionUID**:为了保证序列化版本的兼容性,每个可序列化类应...
默认情况下,序列化会保存对象的所有实例变量,但不包括静态变量。这是因为静态变量属于类,而非特定的对象实例。序列化时,只有那些非transient和非static的字段会被写入字节流。 3. **自定义序列化行为** ...
如果你确实需要序列化静态变量,你需要使用`transient`关键字标记那些不需要序列化的静态变量,或者自定义序列化和反序列化逻辑。 总结起来,Java的序列化是一个强大的工具,允许对象在网络和磁盘之间自由移动,...
通过实现`Serializable`接口,一个对象可以被序列化和反序列化,但需要注意的是,静态变量和方法以及不可序列化的对象引用不会被保存。此外,通过自定义`writeObject()`和`readObject()`方法,可以实现更复杂的序列...
5. **静态成员变量或Application**: 适用于全局共享的数据,但需谨慎处理,避免内存泄漏。 6. **文件存储**: 将数据写入文件,然后在需要时读取,适合大量数据的持久化存储。 7. **数据库**: 如SQLite,适合存储结构...
- 静态变量和成员方法不会被序列化,只有实例变量会被保存。 - 如果对象的成员变量引用了其他对象,这些对象也会被序列化。如果引用的对象不可序列化,会导致`NotSerializableException`异常。可以通过声明为`...
2. **非静态成员变量**:序列化只涉及非静态成员变量,成员方法和静态成员变量不会被序列化。 3. **transient关键字**:如果某个变量的状态不应该被序列化,可以通过`transient`关键字标记。 4. **继承关系**:如果...
反序列化失败的原因报告 反序列化失败的原因报告是指在从 Redis 获取对象并在本地进行反序列化时,反序列化失败的原因分析和解决方案。下面是详细的知识点解释: 序列化和反序列化 序列化是指将对象转换成字节流...
为了使类能够被正确地序列化,每个成员变量(字段或属性)必须具有公共访问级别,并且非静态。此外,可以使用`[Serializable]`、`[XmlElement]`或`[XmlAttribute]`等特性来自定义序列化的行为。 3. **Worker类**: ...
7. **序列化与反序列化**:如果你的类实现了序列化接口,静态变量在序列化和反序列化过程中可能不会被正确处理,导致“消失”。 为了解决这个问题,你需要: - 检查静态变量的赋值和引用操作,确保没有在不应该的...
- **仅实现`Serializable`接口**:当`Customer`类只实现了`Serializable`接口时,序列化过程会默认对`Customer`对象的非瞬态实例变量进行序列化;反序列化时,也会采用同样的方式恢复这些变量。 ```java ...
在示例代码中,`Student`类实现了`Serializable`接口,因此它的`name`和`age`字段会被序列化,但`QQ`(静态变量)和`address`(被`transient`修饰)不会。在序列化和反序列化过程中,`address`字段由于没有对应的...