“你好,阿米戈!我想補充一點艾莉告訴你的話。”

有時您需要控制序列化過程。以下是一些原因:

1) 一個對像還沒有準備好序列化:它當前的內部狀態正在改變。

2) 一個對象包含不可序列化的對象,但可以將它們轉換成易於序列化的形式,例如將它們保存為字節數組或其他東西。

3) 一個對像想要將其所有數據作為一個單元反序列化和/或在序列化之前對其進行加密。

您可能想要手動執行序列化的原因有很多。但我們不想失去標準序列化提供的所有優勢。畢竟,我們的對象可能會使用其他對象。但是如果我們的對像不支持序列化,它們就不能被序列化。

這種情況也有解決辦法:Externalizable接口。我們必須感謝 Java 富有遠見的創造者。只需將Serializable接口替換為Externalizable接口,您的類就可以手動管理序列化過程。

Externalizable接口有兩個方法,而Serializable接口沒有,它們在對像被序列化時由 Java 機器調用這是它的樣子:

代碼
class Cat implements Externalizable
{
 public String name;
 public int age;
 public int weight;

 public void writeExternal(ObjectOutput out)
 {
  out.writeObject(name);
  out.writeInt(age);
  out.writeInt(weight);
}

 public void readExternal(ObjectInput in)
 {
  name = (String) in.readObject();
  age = in.readInt();
  weight = in.readInt();
 }
}

讓你想起了什麼?

“天哪!這正是我們在考慮序列化之前嘗試保存對象的方式。”

“這讓一切變得簡單:如果標準序列化足夠了,我們就繼承Serializable接口。如果不夠,那麼我們繼承Externalizable並編寫我們自己的代碼來保存/加載我們的對象。”

“但是標記為Externalizable 的類是否被認為是可序列化的?我們可以使用這樣的類來“安全地”存儲對我們的可序列化類的引用嗎?”

“是的。如果一個類實現了SerializableExternalizable,它就被認為是可序列化的。”

“這是完美的解決方案。我喜歡它。”

“我很高興聽到這個消息。但還有更多……你應該問問漢斯教授所有的細微差別。它們確實存在。他想給你一些東西來讀。”