Java中的自定义序列化
我有以下课程Java中的自定义序列化,java,serialization,Java,Serialization,我有以下课程 class UserAccount implements Serializable { public String username; public String password; public UserAccount() { username = "defaultUsername"; password = "defaultPassword"; } public UserAccount(Strin
class UserAccount implements Serializable
{
public String username;
public String password;
public UserAccount()
{
username = "defaultUsername";
password = "defaultPassword";
}
public UserAccount(String u, String p)
{
username = u;
password = p;
}
private void readObject(ObjectInputStream o)
throws IOException, ClassNotFoundException
{
//username = (String)o.readObject();
o.defaultReadObject();
}
private void writeobject(ObjectOutputStream o)
throws IOException, ClassNotFoundException
{
//o.defaultWriteObject();
o.writeObject(username);
}
public String toString()
{
return username + ", " + password;
}
}
我编写了以下代码段来序列化和反序列化它的一个实例
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("out.dat")));
out.writeObject(new UserAccount("test", "test2"));
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File("out.dat")));
UserAccount u = (UserAccount)in.readObject();
in.close();
System.out.println(u);
我正在使用writeObject()
钩子自定义序列化,因此,我只保留用户名
。但是当我读回对象时,我会执行默认的反序列化
我希望输出是test,null
,而输出是test,test2
基本上,我希望成员password
为null
,因为我没有保留它。有人能帮我理解密码是如何初始化为test2
的吗
我还验证了在反序列化过程中没有调用构造函数[我知道不会调用它,但我检查了它]
提前感谢。writeObject()
不会取代默认的序列化机制,而是添加到其中(允许您向流中添加其他数据)
如果您想要一个完全自定义的机制,考虑执行<代码> java .IO。可外化< /COD>而不是<代码> java .IO。 从:
序列化流中只写入可外部化的实例的类的标识,该类负责保存和恢复其实例的内容。Externalizable
接口的writeExternal
和readExternal
方法由类实现,以使类能够完全控制对象及其超类型的流的格式和内容。这些方法必须显式地与超类型协调以保存其状态。这些方法取代了writeObject
和readObject
方法的定制实现
对变量使用transient
关键字使其不序列化。这可能是对斯卡夫曼答案的另一种解决方案
引用:如果只需要跳过类的一些实例变量,那么这是正确的方法。@skaffman…那么defaultWriteObject()
的目的是什么呢。我的印象是,如果省略这一行,那么就可以避免默认的序列化。@skaffman只有当writeObject()方法调用defaultWriteObject()时才是这样,而他没有这样做。