Java readObject/writeObject在序列化中的使用

Java readObject/writeObject在序列化中的使用,java,serialization,jakarta-ee,Java,Serialization,Jakarta Ee,我一直在学习,以进一步了解Java序列化过程。当谈到readObject/writeObject的使用时,我可以看到两个用例: 我们可以使用writeObject在字节码序列化之前对其进行加密。从安全角度来看,这是件好事 我们可以使用readObject来执行反序列化后需要立即执行的任何特定代码段,从第1点开始,我们甚至可以使用readObject来解密序列化对象时删除的字节码 在通过编写customr readObject/writeObject方法序列化/反序列化对象时,您是否遇到过其他实际

我一直在学习,以进一步了解Java序列化过程。当谈到
readObject/writeObject
的使用时,我可以看到两个用例:

  • 我们可以使用
    writeObject
    在字节码序列化之前对其进行加密。从安全角度来看,这是件好事
  • 我们可以使用
    readObject
    来执行反序列化后需要立即执行的任何特定代码段,从第1点开始,我们甚至可以使用
    readObject
    来解密序列化对象时删除的字节码

  • 在通过编写customr readObject/writeObject方法序列化/反序列化对象时,您是否遇到过其他实际情况?或者,如果您能告诉我在哪里可以看到readObject/writeObject的一些合理而实用的用法?

    使用自定义序列化可能有几个原因:

  • 表演
  • 与外部系统接口。(超出您的能力范围,甚至是非Java系统。)
  • 需要人类可读的格式
  • 支持序列化类的旧版本

  • 仅举几个例子,但我相信还有很多。

    出于性能原因,或向后兼容性原因,或由于要序列化的字段不可序列化,您可以实现自己的readObject/writeObject


    对于readObject/writeObject的好例子,我将查看JDK附带的源代码。或者我会尝试

    自定义
    读取对象
    方法在对象反序列化后需要初始化临时(非序列化)字段时也很有用



    顺便说一句,请查看(我不确定第二版中的章节/项目编号)。这是一本优秀的序列化读物。

    我认为使用基于CipherOutputsStream的ObjectOutputStream可以更好地进行解密

    writeObject/readObject最重要的用途是,如果您希望在多个代码版本中保持序列化的稳定性。您的内部表示(成员变量)可能会更改,但序列化必须稳定,因为您与旧系统通信(例如,通过从文件中读取旧数据)


    但是对于这些情况,我更喜欢外部化接口,因为它更易于使用(没有只有jvm知道的隐式调用和方法)。

    实际上它确实知道。。。我想了解一些关于它在您的应用程序中使用情况的评论。虽然自定义序列化是一件奇特的事情,但在readObject()中初始化瞬态或静态变量是经常使用的功能。@Vicky:“实际上是这样的”,正如中所示,有效的Java链接回答了您的问题?是的,我现在在书中查找。但是你关于初始化瞬态字段的回答帮助了我。请更新文章的链接。这就是(例如)实现writeObject/readObject方法的原因吗?
    public class Employee implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private int empno;
        private String ename;
        private String job;
    
        // setter & getter
    
        @Override
        public String toString() {
            return "Employee [empno=" + empno + ", ename=" + ename + ", job=" + job
                    + "]";
        }
    
        private void writeObject(ObjectOutputStream out) throws IOException {
    
            // default serialization
            // out.defaultWriteObject();
    
            // custom serialization
            out.writeInt(empno);
            out.writeUTF(ename);
            // out.writeUTF(job); //job will not serialize
        }
    
        private void readObject(ObjectInputStream in) throws IOException,
                ClassNotFoundException {
    
            // default deSerialization
            // in.defaultReadObject();
    
            // custom deSerialization
            empno = in.readInt();
            ename = in.readUTF();
            // this.job = in.readUTF();
        }
    
    }