序列化/反序列化机制

Mri*_*hal 5 java serialization deserialization

说,我有一个X具有字段值的类,即

class X implements Serializable {
    private int value;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

此外,它没有在这里显示的getter和setter.这个类是序列化的.在反序列化中,结束同一类具有值字段,访问说明符是公共的.此外,这个类没有getter和setter.所以,我的问题是:

  1. 如果字段的访问说明符发生更改或者反序列化结束时类中的某些或所有方法丢失,反序列化是否会失败?
  2. 在反序列化期间为字段分配值的机制是什么?

Dea*_*mer 5

一些好的链接Java序列化算法揭示了

1)如果字段的访问说明符发生更改,或者在反序列化结束时类中缺少部分或全部方法,反序列化是否会失败?

序列化使用Using Reflection进行

Java使用.检测对类的更改

private static final long serialVersionUID

默认值涉及哈希码.序列化根据以下信息创建long类型的单个哈希码:

  • 类名和修饰符

  • 类实现的任何接口的名称

  • 除私有方法和构造函数之外的所有方法和构造函数的描述

  • 除私有,静态和私有瞬态之外的所有字段的描述

序列化机制的默认行为是经典的"更安全而不是抱歉"策略.序列化机制使用suid(默认为极其敏感的索引)来告知类何时发生了更改.如果是这样,序列化机制拒绝使用使用旧类序列化的数据创建新类的实例.

2)在反序列化期间为字段分配值的机制是什么?