zzh

zzh

Jdk8のstatic変数はシリアライズ可能ですか?

先に結論を述べますが、static 変数はシリアライズできません。

検証:
  • エンティティクラス:
@Data
public class SysRole implements Serializable {

    // ロールID
    private BigInteger id;
    // ロール名
    private String name;
    // ロールコード システム管理者かどうかを判断できます
    private String code;
    // ロールの説明
    private String description;
    // 作成者ID
    private BigInteger createBy;
    // 変更者ID
    private BigInteger modifyBy;
    // ステータス:0:無効 1:有効
    private int status;
    // 作成日時
    private Date created;
    // 変更日時
    private Date lastUpdateTime;
    
    private static String remark;
    
    public void setRemark(String remark){
        this.remark = remark;
    }
    
    public String getRemark(){
        return remark;
    }
}
  • シリアライズ:
SysRole sysRole = new SysRole();
sysRole.setName("213");
sysRole.setCreated(new Date());
sysRole.setCode("132");
System.out.println(sysRole.toString());
sysRole.setRemark("how");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("d:/user.txt"));
objectOutputStream.writeObject(sysRole);
  • デシリアライズ:
ObjectInputStream objectInputStream = null;
try {
    objectInputStream = new ObjectInputStream(new FileInputStream("d:/user.txt"));
} catch (IOException e) {
    throw new RuntimeException(e);
}
SysRole readObject = null;
try {
    readObject = (SysRole)objectInputStream.readObject();
} catch (IOException e) {
    throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
    throw new RuntimeException(e);
}
System.out.println(readObject.getRemark());
  • 結果:

image

  • 例外
    デシリアライズコード:
---------追加コード------------
SysRole sysRole = new SysRole();
sysRole.setRemark("what");
---------追加コード------------

ObjectInputStream objectInputStream = null;
try {
    objectInputStream = new ObjectInputStream(new FileInputStream("d:/user.txt"));
} catch (IOException e) {
    throw new RuntimeException(e);
}
SysRole readObject = null;
try {
    readObject = (SysRole)objectInputStream.readObject();
} catch (IOException e) {
    throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
    throw new RuntimeException(e);
}
System.out.println(readObject.getRemark());

結果:

image

原因分析:

image
つまり、static 変数はクラスオブジェクトに保存されるため、sysRole が remark を設定すると、後続の SysRole オブジェクトで使用するためにクラスオブジェクトに保存されます。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。