java中的反序列化步骤

java中的反序列化步骤,java,serialization,Java,Serialization,关于反序列化的几个问题: 1) 为什么序列化时需要提供默认构造函数? 2) 为什么字段“lock”在反序列化后没有得到初始化 编辑:忘了在我原来的帖子中添加“暂时的”。现在添加了 1) 为什么在序列化的情况下需要提供默认构造函数 这不是一个要求。或者至少,如果您使用使用ObjectInputStream和ObjectOutputStream实现的序列化,那么这不是一个要求 2) 为什么字段“lock”在反序列化后没有得到初始化 它应该被初始化。。。如果您使用的是ObjectInputStream

关于反序列化的几个问题: 1) 为什么序列化时需要提供默认构造函数? 2) 为什么字段“lock”在反序列化后没有得到初始化

编辑:忘了在我原来的帖子中添加“暂时的”。现在添加了

1) 为什么在序列化的情况下需要提供默认构造函数

这不是一个要求。或者至少,如果您使用使用
ObjectInputStream
ObjectOutputStream
实现的序列化,那么这不是一个要求

2) 为什么字段“lock”在反序列化后没有得到初始化

它应该被初始化。。。如果您使用的是
ObjectInputStream
ObjectOutputStream
lock
对象应该序列化,然后反序列化

(如果出现
显然未初始化的情况,请发布一条说明发生了什么。)

我错误地断言,
ReentrantReadWriteLock
不可序列化。。。是的

在具有
瞬态的版本中更新
a
的反序列化实例的
lock
字段将为
null
lock
声明中的初始化表达式未执行

有关更多信息,请阅读


如果您使用的是其他序列化机制,则需要说明它是什么

  • 不需要
  • 锁被初始化,下面的代码会打印初始化的锁(只需在字节数组中写入
    B
    的对象并从中读回)


  • Serializable
    是一个接口,因此它应该是
    implements Serializable
    2)为什么字段“lock”在反序列化后没有得到初始化?
    因为它是瞬态的。@EpicPandaForce,lock没有得到去序列化,因为它是瞬态的。但为什么它没有用新对象“初始化”?实际上,我想了解反序列化的步骤,因为它没有得到初始化?我建议您阅读任何java序列化教程以获得清晰的图片。回答您的问题:1)根本不需要2)由于锁变量是“瞬态”的,所以在序列化对象时跳过它,并且在反序列化锁变量时,锁变量将初始化为null。
     class A extends Serializable{
          public A(){}
    int x=0;
          private final transient ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    
        }
    
    public class B implements Serializable {
        private int x = 0;
        private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            try (ObjectOutput out = new ObjectOutputStream(bos)) {
                 out.writeObject(new B());
            }
            catch (IOException e) {
                e.printStackTrace();
                throw e;
            }
            byte[] bytes = bos.toByteArray();
    
            ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
            try (ObjectInput in = new ObjectInputStream(bis)) {
                B b = (B) in.readObject();
                System.out.println(b.lock);
            }
            catch (IOException e) {
                e.printStackTrace();
                throw e;
            }
          }
       }
    }