当一个java类继承Serializable后,一般编辑器会提示你生成一个serialVersionUID,在eclipse下可以自动生成一个随机的uid,乍一看生成后一切OK,运行良好,eclipse也不再出现警告,皆大欢喜。
后来网站出现了一个很奇怪的问题,struts架构下的网站经常出现javax.servlet.ServletException: BeanUtils.populate 错误,但是本地运行又一切正常,唯一觉得可能产生问题的就是服务器上跑了好几个网站,都是一样的架构的,怀疑是不是web容器把几个项目之间的java类给共用了,考虑到很多类都定义了serialVersionUID字段,然后尝试删除了某个类的serialVersionUID,结果关于该类的操作就恢复正常了。网上简单查阅了一下资料,感觉是tomcat把所有类串行化时候,由于我们的几个项目很多java类都是复制粘贴的,所以导致了很多类的serialVersionUID都是同一个值,所以tomcat会把不同项目的相同类名的类当作同一个类去处理,导致了这个奇怪的错误。
解决方案:1、去掉serialVersionUID定义,不管他,对于web项目来说兼容性问题不大。
2、没个项目的类都重新生成一下serialVersionUID,不能直接的复制粘贴过来。
serialVersionUID作用:
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
有两种生成方式:
一个是默认的1L,比如:private static final long serialVersionUID = 1L;
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
private static final long serialVersionUID = xxxxL;
当你一个类实现了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,可避开不兼容性问题。
分享到:
相关推荐
### Java序列化(Serializable)与反序列化详解 #### 序列化概念与应用场景 序列化是指将程序中的对象转换为一系列字节序列的过程,主要用于保存对象的状态以便将来使用或者在网络之间传输对象。Java提供了内置的...
Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式。凡是实现Serializable接口的类都有一个表示序列化...
如果在类定义中没有显式声明,Java编译器会自动生成一个。当类的结构发生变化时,建议显式声明`serialVersionUID`以避免反序列化时出现`InvalidClassException`。 5. **transient关键字**:某些对象属性可能不需要...
首先,要实现一个对象的序列化,该对象的类必须实现`java.io.Serializable`接口。这是一个标记接口,不包含任何方法,它的作用是告诉Java运行时系统,该类的对象是可以序列化的。例如: ```java public class User ...
在此示例中,`Person` 类继承自 `Humanoid` 类,并实现了 `Serializable` 接口,这使得 `Person` 类可以被序列化。 #### 1.2 对象的序列化及反序列化 为了将可序列化的对象序列化到文件或其他存储介质中,需要使用...
通过`File` -> `Settings` -> `Editor` -> `Inspections`,找到“Serializable class without 'SerialVersionUID'”,将其级别设为Error并勾选,可以确保每次继承Serializable时都有提示。 6. 修改Javadoc注释错误...
4. **字节码**:Java源代码编译后生成的中间表示形式,字节码可以跨平台运行,提高了移植性。 5. **Oracle JDK与OpenJDK**:Oracle JDK是Oracle公司提供的官方版本,包含商业组件和长期支持;OpenJDK是开源社区维护...
5. **`serialVersionUID`:** 如果类实现了 `Serializable` 接口,则推荐定义一个 `serialVersionUID` 字段,以确保序列化版本的兼容性。 #### 三、主方法与程序入口 **重要性:** `main()` 方法是 Java 程序的...
对于序列化接口的使用,Idea默认不会像Eclipse那样在类继承Serializable接口时提醒生成`serialVersionUID`。可以在`File` -> `Settings` -> `Editor` -> `Inspections`中,将`Seralizable class without '...
在Java中,实现`Serializable`接口的类可以被序列化和反序列化,从而在网络中传递。 ```java package dataserver.rmi.bean; import java.io.Serializable; public class Account implements Serializable { ...
- 被 `final` 关键字修饰的类,如 `java.lang.String`,不能被继承。 - 八大基本数据类型的包装类,如 `java.lang.Integer`,也是 final 的。 - String 类本身也是 final 的。 12. `final`, `finally`, `...
- **Class is Serializable, but doesn't define serialVersionUID**:类是可序列化的,但是没有定义`serialVersionUID`。 - **描述**:序列化时如果没有指定版本ID,可能会导致序列化失败。 - **处理**:生成并...
3. `serialVersionUID`:默认由JVM生成,用于版本控制,当类发生改变时,可能需要手动更新此ID以避免反序列化异常。 4. 继承关系:如果父类没有实现`Serializable`,子类实现该接口,父类的所有非静态、非瞬态字段也...
这个问题通常是由于 MyBatis-Plus 自动为实体类中的 `id` 字段生成默认值,而这个默认值与数据库中的字段类型不匹配导致的。 首先,我们需要理解 MyBatis-Plus 的 `insert` 方法的工作原理。默认情况下,MyBatis-...
- `<package>`元素中`extends="json-default"`表示该包继承自`json-default`,后者又继承自`struts-default`。 - `<action>`元素定义了三个Action,分别对应返回字符串、对象、列表的方法。 - `<result>`元素的`...
设计数据实体类,例如`UserEntity`,并实现`Serializable`接口: ```java public class UserEntity implements Serializable { private static final long serialVersionUID = -3258839839160856613L; private ...
public class UserInfo implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "user_id", type = IdType.AUTO) private Integer userId; private String ...