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()时才是这样,而他没有这样做。