深入理解序列化
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
.
为某些字段选择性地关闭此功能
您可以通过实施 writeObject
和 readObject
方法放弃默认的序列化机制。如果这样做,您就可以完全自由地决定对象的序列化方式。
最后,您可以混合搭配:实现这两个方法,但仍然 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
提供的默认序列化方式对您来说足够好,那么您可以这样做。
如果您想自定义某些内容(例如,根本不写出密码,或以某种加密方式写出),您只需要使用 transient
、writeObject
等。
我正在尝试学习序列化,但我无法理解以下概念。
我有一个名为 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
.
您可以通过实施 writeObject
和 readObject
方法放弃默认的序列化机制。如果这样做,您就可以完全自由地决定对象的序列化方式。
最后,您可以混合搭配:实现这两个方法,但仍然 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
提供的默认序列化方式对您来说足够好,那么您可以这样做。
如果您想自定义某些内容(例如,根本不写出密码,或以某种加密方式写出),您只需要使用 transient
、writeObject
等。