“你好,阿米戈!我想補充一點艾莉告訴你的話。”
有時您需要控制序列化過程。以下是一些原因:
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 的類是否被認為是可序列化的?我們可以使用這樣的類來“安全地”存儲對我們的可序列化類的引用嗎?”
“是的。如果一個類實現了Serializable或Externalizable,它就被認為是可序列化的。”
“這是完美的解決方案。我喜歡它。”
“我很高興聽到這個消息。但還有更多……你應該問問漢斯教授所有的細微差別。它們確實存在。他想給你一些東西來讀。”