在java序列化/反序列化中调用defaultWriteObject()和defaultReadObject()的目的是什么?

时间:2014-10-03 18:58:31

标签: java serialization deserialization

如果我实现writeObject或readObject方法,如果我不调用defaultWriteObject()/ defaultReadObject()会发生什么?  是不是要编写类元数据(类名等),这通常是在默认序列化期间完成的?

  1. 如果没有编写类的元数据,那么在反序列化期间是否还需要在JVM路径中使用序列化对象的类?这是当我尝试这一点时发生的事情 - 在序列化时将类保留在路径中但在反序列化期间将其取出:
  2. 例外:

    Exception in thread "main" java.io.StreamCorruptedException: unexpected block data
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
        at java.io.ObjectInputStream.readSerialData(Unknown Source)
        at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.readObject(Unknown Source)
        at com.fiberlink.sample.JwtCreator.main(JwtCreator.java:28)
    

    为什么java会抛出此异常?如果我在路径中有类,则不会抛出此异常。如果该类的元数据不存在,那么如何进行交叉检查才能看到该类在路径中?

    1. 如果仍然会写入元数据,那么这样做?我在可序列化的类中实现了writeObject方法,并没有调用默认方法。元数据来自哪里?
    2. 这是我写的可序列化类:

      public class TestSerial implements Serializable
      {
          private static final long serialVersionUID = 1L;
          public transient int a = 4;
          public String c = "ccccc";
          public String b = "bbbbb";
      
          private void writeObject(ObjectOutputStream os)
          {
              try {
                  os.writeInt(a); // 3
              }
              catch (Exception e) {
                  e.printStackTrace();
              }
          }
      
          private void readObject(ObjectInputStream is)
          {
              try {
                  a = is.readInt();
                  System.out.println(a);
              }
              catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }
      

0 个答案:

没有答案