更深入地了解序列化

时间:2015-01-27 03:08:30

标签: java serialization

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

我有一个名为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关键字。我相信这背后有一些原因,任何人都可以解释我。

感谢。

1 个答案:

答案 0 :(得分:3)

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

您可以通过制作transient来选择性地关闭某些字段。

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

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

  

现在我的问题是,我们可以通过一种非常简单的方式来实现这一点,例如删除用于密码的transient关键字。

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

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