java - 序列化和反序列化变量删除

标签 java serialization

假设我序列化了下面的类(通过给字段 x 赋值,比如说 5),并且在进行反序列化之前,我删除了字段 x 并添加一个新字段y(intfloat),结果会是什么?

我相信反序列化已成功完成并且字段 y 的值将是默认值,这是正确的吗?

如果这是正确的,如果 x 将在序列化时从持久对象到有状态对象的转换中,值会去哪里?

public class Cat implements Serializable{    
  private static final long serialVersionUID = 4231235177539824282L;  
  int x;
}

反序列化之前:

public class Cat implements Serializable{    
  private static final long serialVersionUID = 4231235177539824282L;  
  float/int y;
}

最佳答案

序列化规范详细说明了字段反序列化的内部工作原理(您可以在这里找到它:http://docs.oracle.com/javase/7/docs/platform/serialization/spec/input.html)

如果您浏览“readObject 方法”部分,它指出:

Any field of the object that does not appear in the stream is set to its default value. Values that appear in the stream, but not in the object, are discarded. This occurs primarily when a later version of a class has written additional fields that do not occur in the earlier version.

所以本质上,字段“x”在流中会有一些值,但会被丢弃并且字段“y”将设置为 0(默认值),因为它没有出现在流中。

关于java - 序列化和反序列化变量删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9682978/

相关文章:

c# - 连续发送鼠标位置到另一台机器

Java-WS RS资源结构

java - 批处理在 Spring+Hibernate+JPA 中内存不足

java - 如何将 Map<Path, List<Path>> 流式传输到包含绝对路径作为字符串的 List<String>?

java - java 反序列化对象列表

php - 如何序列化在属性内部有闭包的对象?

java - 将枚举描述与变量参数相结合

java - 使用 toString 递归打印 Node 及其后继者

javascript - QuerySet 不是 JSON 可序列化的 Django

scala序列化总是抛出异常,为什么?