gpt4 book ai didi

java - 深入理解序列化

转载 作者:行者123 更新时间:2023-11-29 05:11:53 25 4
gpt4 key购买 nike

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

我有一个名为 Account 的类,该类需要序列化,Accounts 类有两个变量用户名和密码。其中密码不需要序列化。所以我们添加了关键字 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

麻烦从这里开始。他们说如果你想序列化密码,那么在需要序列化的类中编写一个具有以下签名的回调方法。

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

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

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

谢谢。

最佳答案

如果您声明您的类是Serializable,Java 将序列化它的所有字段。

您可以通过使这些transient有选择地关闭某些字段。

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

最后,您可以混合搭配:实现这两种方法,但仍然让 Java 序列化“简单字段”。为此,您从自己的 writeObject 实现中调用 defaultWriteObject。这将为您序列化所有非 transient 字段,因此您只需担心其他字段。

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

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

你只需要使用transient, writeObject 等,如果你想定制一些东西(例如根本不写出密码,或者写成一些加密时尚)。

关于java - 深入理解序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28162578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com