我正在努力学习序列化,在哪里我无法理解以下概念。
我有一个名为Account的类,这个类需要序列化,Accounts类有两个变量用户名和密码。其中的密码不需要序列化。因此,我们添加关键字瞬态。
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现在我的问题是,我们可以用一种非常简单的方式实现这一点,比如删除密码的瞬态关键字。我相信这背后是有原因的,有人能解释我吗?
谢谢。
发布于 2015-01-27 03:26:02
如果将类声明为Serializable,Java将序列化其所有字段。
您可以通过创建这些transient来选择性地关闭某些字段。
您可以通过实现writeObject和readObject方法来放弃默认的序列化机制。如果这样做,您就可以完全自由地处理如何序列化对象。
最后,您可以混合和匹配:实现这两种方法,但Java仍然将“轻松字段”序列化。为此,您可以在自己的writeObject实现中调用writeObject。这将序列化所有对您来说不是短暂的字段,因此您只需担心其他字段。
现在我的问题是,我们可以用一种非常简单的方式实现这一点,比如删除密码的瞬态关键字。
是。如果声明Serializable所提供的默认序列化方式对您来说足够好,那么您可以这样做。
您只需要使用transient、writeObject等来定制某些内容(例如,根本不写密码,或者以某种加密的方式写出密码)。
https://stackoverflow.com/questions/28162578
复制相似问题