我正在尝试学习序列化以及我无法理解以下概念。
我有一个名为Account的类,该类需要序列化,Accounts Class有两个变量username和password。其中密码无需序列化。所以我们正在添加关键字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关键字。我相信这背后有一些原因,任何人都可以解释我。
感谢。
答案 0 :(得分:3)
如果您将类声明为Serializable
,Java将序列化其所有字段。
您可以通过制作transient
来选择性地关闭某些字段。
您可以通过实施writeObject
和readObject
方法放弃默认序列化机制。如果您这样做,您可以完全自由地对序列化对象的方式。
最后,你可以混合搭配:实现这两种方法,但仍然有Java序列化“简单字段”。为此,您可以在自己的defaultWriteObject
实施中调用writeObject
。这将序列化所有不是瞬态的字段,因此您只需要担心其他字段。
现在我的问题是,我们可以通过一种非常简单的方式来实现这一点,例如删除用于密码的transient关键字。
是。如果通过声明Serializable
提供的默认序列化方式对您来说足够好,那么您就可以这样做。
如果您想要自定义某些内容(例如,根本不写出密码或以某种加密方式写出来),您只需要使用transient
,writeObject
等。