Java对象序列化......它是冗余且健壮的吗?

时间:2014-10-20 07:50:01

标签: java serialization

我有几件事我想澄清一下:

当存储其他难以存储的数据时,对象序列化非常方便。您使用具有Seri​​alVersionUUID的类,然后您可以阅读&写下来。如果:

  1. 我在可序列化类中添加了一个新变量,以便旧的可序列化对象不具备此变量?它是否仍会加载并保持变量未初始化或者是否会抛出异常,使序列化对象无法使用?
  2. 如果我更改SerialVersionUUID怎么办? "过时"序列化对象将不再加载?有没有办法轻松转换它们,或者是否有适当的自定义系统?
  3. 如果我更改已存在的变量类型该怎么办?可能有一个转换异常?
  4. 是否有任何替代方法可以保存大型可序列化类,如果"模型"数据不会被破坏。 (作为可序列化的类)被改变了吗?
  5. 提前感谢您回答此问题。如果问题不好,我道歉。他们刚刚出现在我的脑海里,我想了解更多。

    在四处寻找发布礼仪之后,在一篇文章中提出多个问题是不被禁止或不赞成的。唯一的风险是得到错误答案。

1 个答案:

答案 0 :(得分:1)

  

Java对象序列化......是多余的

没有

  

且健壮吗?

对于在其规范中定义的约束内的类版本控制,它是相当健壮的。对于“健壮”的任何其他价值,您需要定义您的条款。

  
      
  1. 我在serializable类中添加了一个新变量,以便旧的可序列化对象没有这个变量?它是否仍会加载并保持变量未初始化或者是否会抛出异常,使序列化对象无法使用?
  2.   

它会使变量未初始化。

  
      
  1. 如果我更改SerialVersionUUID怎么办?
  2.   

它将抛出InvalidClassException.

  

“过时的”序列化对象将不再加载?

见上文。

  

有没有办法轻松转换它们,或者是否有自定义系统来实现这一目标?

没有。道德:不要改变serialVersionUID。与互联网上发现的许多善意但不知情的观点相反,这表明例如在每次修订时都会改变它。 从不 更改它,除非 具体 想要InvalidClassException

  
      
  1. 如果我更改已存在的变量类型该怎么办?可能有一个转换异常?
  2.   

它会引发异常。您无法更改可序列化成员变量的类型。

  
      
  1. 如果“模型”(可序列化的类)被更改,是否有任何替代方法可以保存大型可序列化类,使数据不会损坏?
  2.   

您需要学习Versioning chapter of the Object Serialization Specification,其中所有这些问题都得到了解答。