先上結論,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());
- 結果:
- 例外
反序列化代碼:
---------新增代碼------------
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());
結果:
原因分析:
也就是說 static 變數會放在 class 對象上,因此 sysRole 設置了 remark 以後會保存在 class 對象上供後續的 SysRole 對象使用。