Java:您希望何时自定义序列化过程? 在什么情况下,出于什么原因,应该考虑定制序列化< /代码>过程?(以下方法是将由JVM调用的方法)

Java:您希望何时自定义序列化过程? 在什么情况下,出于什么原因,应该考虑定制序列化< /代码>过程?(以下方法是将由JVM调用的方法),java,serialization,deserialization,Java,Serialization,Deserialization,我能想到的唯一原因是,当超类已经可以序列化时,您希望子类作废序列化,然后您只需在子类的两个方法中都抛出异常即可 我不确定是否有任何其他具体原因。您可能希望自定义在读写时要执行的操作--您可以添加额外的日志记录,您可以执行计算,您可能只想在满足某些条件时读写,等等。实际上,您可以做Java允许的任何事情。有关示例,请参见“自定义默认协议”一节中的从SUN读取协议 重写readObject和writeObject的一个常见原因是为本身不可序列化的超类序列化数据 验证流 加密序列化对象 我想在某些情况

我能想到的唯一原因是,当超类已经可以序列化时,您希望子类作废
序列化
,然后您只需在子类的两个方法中都抛出异常即可


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

您可能希望自定义在读写时要执行的操作--您可以添加额外的日志记录,您可以执行计算,您可能只想在满足某些条件时读写,等等。实际上,您可以做Java允许的任何事情。有关示例,请参见“自定义默认协议”一节中的从SUN读取协议

  • 重写
    readObject
    writeObject
    的一个常见原因是为本身不可
    序列化的超类序列化数据
  • 验证流
  • 加密序列化对象

  • 我想在某些情况下,您可能需要控制序列化:

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


    希望它能有所帮助。

    另一个重要原因是当您希望减少序列化的数据量时。以容量为1024的
    HashMap
    为例。假设到目前为止它只有3个条目。序列化一个1024的
    对象
    数组将是非常浪费的,因为它只需要序列化三个条目


    另请注意,如果要序列化的对象引用了不可序列化的服务,则应首先将这些成员标记为临时成员(以防止序列化),但是,然后使用
    writeObject
    捕获足够的信息,以便
    readObject
    可以在反序列化时重新建立引用。

    自定义序列化的优点之一是可以将临时字段(如从其他类继承的字段)添加到序列化过程中。你可以这样做

    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();
        }
    }
    
    类NotMyClass实现可序列化{
    字符串登录;
    临时字符串密码;
    //...    
    }
    //我还想序列化临时密码字段
    类MyClass扩展了NotMyClass{
    私有void writeObject(ObjectOutputStream out)引发IOException{
    System.out.println(“defaul序列化”);
    out.defaultWriteObject();
    System.out.println(“我的序列化>>>添加继承的瞬时值”);
    out.writeObject(密码);
    }
    私有void readObject(ObjectInputStream in)引发IOException,
    ClassNotFoundException{
    System.out.println(“诽谤反序列化”);
    in.defaultReadObject();
    
    System.out.println("我的反序列化在什么情况下是可取的?我想不出你为什么要作废你实现的接口所需的方法。当你不想再次维护可序列化接口实现自动维护的超类的状态时,在什么情况下是可取的。我如果超类是可序列化的,大概有原因吧?如果你否定了预期的功能,你就没有按照规定的签名契约进行编码。这是在询问错误和坏代码。那么如果父类已经可序列化,而你想扩展它而不序列化它,我们该怎么办?对;所以我的问题是你认为这有必要吗?
    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();
        }
    }