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();
}
}