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