深入理解序列化

Deeper Understanding of Serialization

我正在尝试学习序列化,但我无法理解以下概念。

我有一个名为 Account 的 class,class 需要序列化,Accounts Class 有两个变量用户名和密码。其中密码不需要序列化。所以我们添加了关键字 transient。

public class CustomizedSerialization{
public static void main(String[] args) throws IOException{

Account acc= new Account();

System.out.println("Serialization Started");
FileOutputStream fos= new FileOutputStream("userDetail.txt");
ObjectOutputStream oos= new ObjectOutputStream(fos);
oos.writeObject(acc);
System.out.println("Serialization Ended");

}
}

class Account implements Serializable{
String username="myusername";
transient String password="mypassword"; 
}


Fine it runs as expected the output is 
Account UserName myusername
Account Password null

麻烦从这里开始。 他们说如果你想序列化密码也然后在需要序列化的 class 中编写一个带有以下签名的回调方法。

现在我在我的帐户中添加以下代码 class

private void writeObject(ObjectOutputStream os) throws Exception{
    System.out.println("writeObject Callback");
    os.defaultWriteObject();
    os.writeObject(password);
}

private void readObject(ObjectInputStream ois) throws Exception{
    ois.defaultReadObject();
    System.out.println("ReadObject Callback");
    this.password=(String)ois.readObject();
}

很酷,它完成了工作……。

Account UserName myusernamedurga
Account Password mypassword

现在我的问题是,我们可以通过一种非常简单的方式实现这一点,比如删除密码的瞬态关键字。我相信这背后有一些原因,谁能解释一下。

谢谢。

如果您将 class 声明为 Serializable,Java 将序列化其所有字段。

您可以通过设置 transient.

为某些字段选择性地关闭此功能

您可以通过实施 writeObjectreadObject 方法放弃默认的序列化机制。如果这样做,您就可以完全自由地决定对象的序列化方式。

最后,您可以混合搭配:实现这两个方法,但仍然 Java 序列化 "easy fields"。为此,您可以在自己的 writeObject 实现中调用 defaultWriteObject。这将为您序列化所有非瞬态字段,因此您只需担心其他字段。

Now my question is, we can realize this in a very simple way like removing the transient keyword for password.

是的。如果仅通过声明 Serializable 提供的默认序列化方式对您来说足够好,那么您可以这样做。

如果您想自定义某些内容(例如,根本不写出密码,或以某种加密方式写出),您只需要使用 transientwriteObject 等。