关于
The serializable class XXX does not declare a static final serialVersionUID field of type long的警告
今天在编写Java程序的时候,发现这个警告提示,于是google了一下。得到答案如下:
If a
serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification. However, it is strongly recommended that all serializable classes explicitly declare serialVersionUID values, since the default serialVersionUID computation is highly sensitive to class details that may vary depending on compiler implementations, and can thus result in unexpected InvalidClassExceptions during deserialization. Therefore, to guarantee a consistent serialVersionUID value across different java compiler implementations, a serializable class must declare an explicit serialVersionUID value. It is also strongly advised that explicit serialVersionUID declarations use the private modifier where possible, since such declarations apply only to the immediately declaring class–serialVersionUID fields are not useful as inherited members.
以上是Serializable在javadoc中的描述。
也既是说:
serialVersionUID用来作为Java对象序列化中的版本标示之用;
如果一个序列化类没有声明这样一个static final的产量,JVM会根据各种参数为这个类计算一个;
对于同样一个类,
不同版本的JDK可能会得出不同的serivalVersionUID;
The serializable class XXX does not declare a static final serialVersionUID field of type long
serialVersionUID作用:
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
你可以随便写一个,在Eclipse中它替你生成一个,有两种生成方式:
一个是默认的1L,比如:private static final long serialVersionUID = 1L;
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = -8940196742313994740L;之类的。
当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个提示功能告诉你去定义之。
在Eclipse中点击类中warning的图标一下,Eclipse就会自动给定两种生成的方式,如上面所述。如果不想定义它,在Eclipse的设置中也可以把它关掉的,设置如下:
Window ==> Preferences ==> Java ==> Compiler ==> Error/Warnings ==> Potential programming problems
将Serializable class without serialVersionUID的warning改成ignore即可。
如果你没有考虑到兼容性问题时,就把它关掉,不过有这个功能是好的,只要
任何类别实现了Serializable这个接口的话,如果没有加入 serialVersionUID,Eclipse都会给你warning提示,这个serialVersionUID为了让该类别 Serializable向后兼容。
如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。
但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,这个可以避开不兼容性的问题。
最后,不考虑兼容性的问题,我把这个warning改成ignore了。
<!--向原作者感谢致敬-->
分享到:
相关推荐
首先,我们需要理解Java序列化的基本概念。Java对象序列化是将对象的状态转换为字节流,以便可以保存到磁盘、通过网络发送或在内存中传输。反序列化则是相反的过程,即从字节流恢复对象。这个过程由`java.io....
* `serial`:当在可序列化的类上缺少 serialVersionUID 定义时的警告 * `finally`:任何 finally 子句不能正常完成时的警告 * `all`:关于以上所有情况的警告 通过 `@SuppressWarnings` 批注,可以选择性地取消特定...
对于序列化警告,可以显式地定义`serialVersionUID`。通过这种方式,不仅可以消除警告,还能提高代码的质量和可维护性。在某些情况下,如果确实无法避免警告,且理解其潜在风险,使用`@SuppressWarnings`注解是一种...
javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据类型之间的可序列化映射关系。 javax.sql.rowset.spi 第三方供应商在其同步提供者的实现中必须使用的标准类和接口。 javax.swing 提供...
#A final什么是JSMutable JSMutable-Java简单可变 它是由迭戈(Diego)使用MIT许可... 我建议您保留递归序列化方法,以便有可能获得对象字段链的所有值,但是对于那些希望改进库的人来说,我仍然留下重要警告:它不是任
综上所述,`serialVersionUID` 在 Java 的序列化机制中扮演着关键角色,它不仅能够确保序列化数据的一致性和完整性,还能够在类结构发生变化时帮助开发者有效管理版本兼容性问题。理解并正确使用 `serialVersionUID`...
Java反序列化漏洞是软件安全领域的一个重要话题,主要出现在使用Java对象序列化和反序列化机制的应用程序中。在标题提及的“Java反序列化漏洞之Weblogic、Jboss利用之payload生成工具”中,我们可以看到这涉及到两个...
为了确保序列化的对象能够在不同版本间正确地反序列化,Java 引入了 `serialVersionUID`。 ##### 1.3 编译警告 如果不显式定义 `serialVersionUID`,IDE(如 Eclipse)会在编译时发出警告,提醒开发者应该定义一个...
这两个类的强大之处在于能够将Java中的对象写入到数据源中(序列化),或者从数据源中恢复为原始对象(反序列化)。 #### 13.9.1 序列化和反序列化操作 **序列化**是指使用`ObjectOutputStream`类将对象的状态转化...
在实例化时,我们可以指定 `T` 的具体类型,如 `ArrayList<String>` 或 `ArrayList<Integer>`。 3. 泛型方法:除了在类中使用泛型,还可以在方法中使用。例如,`public <T> void printList(List<T> list) {...}` ...
javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据类型之间的可序列化映射关系。 javax.sql.rowset.spi 第三方供应商在其同步提供者的实现中必须使用的标准类和接口。 javax.swing 提供一...
对于实现了`Serializable`接口的类,如果没有显式声明`serialVersionUID`字段,则会触发序列化ID警告。例如: ```java public class SerializableExample implements Serializable { private static final long ...
Java Architecture for XML Binding (JAXB) 是Java平台上的一个标准技术,它允许程序开发者将XML文档与Java对象之间进行绑定,实现XML数据的序列化和反序列化。JAXB是Java SE和Java EE环境中的一部分,提供了高效且...
- **数据序列化**:为了在网络上传输对象,可能使用了Java的序列化机制,将消息对象转换为字节流,再在接收端反序列化回原对象。 - **事件驱动编程**:GUI中的按钮点击、文本输入等事件会被注册到事件处理器,当...
- **不当使用序列化**: 不当的序列化使用方式可能导致攻击者能够控制序列化数据。 - **错误地使用特权代码**: 特权代码的误用可能让攻击者有机会提升权限。 #### 九、结论 Java虽然具备良好的安全特性,但在实际...
注解在许多方面都有应用,如编译时和运行时的验证、代码生成、序列化等。 8. **类型安全的异构容器**:Java 5引入了泛型,使得集合可以存储特定类型的元素,这样就确保了集合中的元素类型安全,避免了类型转换异常...
javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据类型之间的可序列化映射关系。 javax.sql.rowset.spi 第三方供应商在其同步提供者的实现中必须使用的标准类和接口。 javax.swing 提供一...
2. 自动生成serialVersionUID:如果没有显式定义serialVersionUID,Java序列化机制会根据Class自动生成一个serialVersionUID。 3. 使用IDE生成serialVersionUID:在Eclipse中,可以使用IDE生成serialVersionUID,...
通过JSON库,如net.sf.json,我们可以方便地在Java对象和JSON字符串间进行互换,从而实现数据的序列化和反序列化。在处理复杂结构时,尤其是嵌套的对象和数组,需要特别注意类型转换和可能出现的类型匹配问题。