javaObjectOutputStream方法的defaultWriteObject和writeObject之间的差异和相似之处

问题描述 投票:1回答:1

我正在尝试了解Java序列化机制,我对此几乎没有疑问

请回答有关Java序列化的以下问题:

  • 为什么我们使用oos.defaultWriteObject();?根据this post,此处存在向后兼容性。我还不太了解它是如何实现的。序列化的不兼容更改之一是删除较新版本中的字段。这意味着较旧的版本将不得不设置有时对用户无效的默认值。这与较新的版本添加一个新字段并允许设置默认值有何不同?
  • 在自定义序列化期间,同时使用oos.defaultWriteObject();oos.writeObject(address);不会有什么区别吗?我的意思是,两者都将所有超类和当前类的非瞬态非静态字段写入OOS。

这里

private void writeObject(java.io.ObjectOutputStream stream)
        throws IOException {
    stream.writeObject(name);
    stream.writeInt(id);
    stream.writeObject(DOB);
}

private void readObject(java.io.ObjectInputStream stream)
        throws IOException, ClassNotFoundException {
    name = (String) stream.readObject();
    id = stream.readInt();
    DOB = (String) stream.readObject();
}

上面的代码产生与下面的代码相同的结果

private void writeObject(java.io.ObjectOutputStream stream)
            throws IOException {
        stream.defaultWriteObject();
    }

    private void readObject(java.io.ObjectInputStream stream)
            throws IOException, ClassNotFoundException {
         stream.defaultReadObject();
    }

[何时使用这两种方法,何时仅使用writeObject(employee); // employee是我的整个对象//]

  1. 这里是可能无法回答我的问题的重复问题的列表。
  2. question 1它表示*如果在写入可选数据(如果有)之前没有一次调用defaultWriteObject或writeFields,则在ObjectInputStream *的情况下实例反序列化的行为是不确定的,但是我仍然可以在不使用deafultwriteobject的情况下调用writeObject 。对吗?
  3. question 2这些答案表示defaultwriteobject方法将一些额外的数据写入流,并以反射方式检查要写入的内容。 oos.writeobject(object obj)是否也进行反思性检查?
  4. 最后,我可以通过重写writeObject和ReadObject方法来控制我的序列化,那么Externalizable的意义何在?
  5. 如果提供串行versionUID不会引发异常,如果我反序列化一个对象,而该对象缺少具有该字段的旧类的字段,将会发生什么情况,如果我提供自己的SerialverUID,基本上所有不兼容的更改将发生什么?是否具有自己的串行版本UID不会针对所有兼容更改抛出streamcorrupted异常?

我试图了解Java序列化机制,并且我几乎没有疑问可以回答以下有关Java序列化的问题:为什么我们使用oos.defaultWriteObject(); ?根据...

java oop serialization stream bytestream
1个回答
0
投票

您的问题

© www.soinside.com 2019 - 2024. All rights reserved.