zzh

zzh

Jdk8 靜態變數是否可以序列化

先上結論,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 變數會放在 class 對象上,因此 sysRole 設置了 remark 以後會保存在 class 對象上供後續的 SysRole 對象使用。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。