2

在什么情况下,出于什么原因应该考虑定制serialization流程?(以下方法是将被调用的方法JVM

 private void writeObject(java.io.ObjectOutputStream out){
         //customize serialization
 }
 private void readObject(java.io.ObjectInputStream in){
         //customize de-serialization
 } 
4

6 回答 6

2

阅读SUN的高级序列化

  1. readObject覆盖and的一个常见原因writeObject是序列化不是Serializable其自身的超类的数据。
  2. 验证流
  3. 加密序列化对象
于 2012-06-19T17:41:17.373 回答
2

我在想一些你可能想要控制序列化的情况:

  • 当您想要加密并稍后解密序列化数据时。
  • 您还可能希望用户或其他应用程序修改对象的序列化形式,因此在这种情况下,您可能想要编写更人性化的东西。
  • 如果您通过网络传输数据,您可能需要调整数据,以便另一端的程序可以理解它。

这些是我现在能想到的原因。

希望能帮助到你。

于 2012-06-19T17:41:22.600 回答
1

One of advantages of customized serialization is possibility to add transient fields (like inherited from other classes) into serialization process. You can do it like this

class NotMyClass implements Serializable {
    String login;
    transient String password;
    //...    
}

//I want to serialize also transient password field
class MyClass extends NotMyClass {

    private void writeObject(ObjectOutputStream out) throws IOException {
        System.out.println("defaul serialization");
        out.defaultWriteObject();

        System.out.println("my serialization >>>> adding inherited transient value");
        out.writeObject(password);
    }

    private void readObject(ObjectInputStream in) throws IOException,
            ClassNotFoundException {
        System.out.println("defaul deserialization");
        in.defaultReadObject();
        System.out.println("my deserialization <<<< reading stored transient value");
        password = (String) in.readObject();
    }
}
于 2012-06-19T18:38:08.130 回答
0

您可能希望在读取或写入时自定义您想要执行的操作——您可以添加额外的日志记录,您可以执行计算,您可能只想在满足某些条件时读取或写入,等等。真的,您可以做任何 Java 允许的事情。例如,请参阅http://java.sun.com/developer/technicalArticles/Programming/serialization/上的“自定义默认协议”部分

于 2012-06-19T17:40:39.387 回答
0

我能想到的唯一原因是当你希望你的子类serialization在超类已经是 void 时失效serializable,然后你可以简单地在子类的两个方法中抛出异常。

我不确定是否还有其他具体原因。

于 2012-06-19T17:34:17.160 回答
0

另一个重要原因是当您想要减少被序列化的数据量时。以容量为 1024 的 a 为例HashMap。假设到目前为止它只有 3 个条目。序列化一个Object1024 的数组会非常浪费,因为它需要做的就是序列化三个条目。

另外,如果您正在序列化的对象引用了不可序列化的服务,您首先将这些成员标记为瞬态(以防止序列化),然后使用writeObject捕获足够的信息,以便readObject可以重新建立引用反序列化。

于 2012-06-19T18:08:22.230 回答