2013-07-01 17:13:15.101 WARN net.spy.memcached.transcoders.SerializingTranscoder: Caught IOException decoding 848 bytes of data java.io.InvalidClassException: com.*.article.qa.entity.Qa_question; local class incompatible: stream classdesc serialVersionUID = 5590259895198052390, local class serialVersionUID = 7673969121092229700 at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) at net.spy.memcached.transcoders.BaseSerializingTranscoder.deserialize(BaseSerializingTranscoder.java:129) at net.spy.memcached.transcoders.SerializingTranscoder.decode(SerializingTranscoder.java:88) at net.spy.memcached.transcoders.TranscodeService$1.call(TranscodeService.java:63) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at net.spy.memcached.transcoders.TranscodeService$Task.run(TranscodeService.java:110) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662)
访问一些链接,访问数据库,底层就抛出这个错误。并非都出现,而是几率性出现。
目前并没有发现不一致的地方。有可能是底层缓存net.spy.memcached里的代码影响。原因是:我本地的实体增加了三个字段,但是缓存里并没有改变影响,进一步追踪中......
根据网上说明:
异常原因
本地和远程的entity序列化后的serialVersionUID不一致导致
解决方法
将本地的序列化的类中的版本号(serialVersionUID )改成和远程中一样,在本地的序列化类里的private static final long serialVersionUID = 改成远程的就行了,如果没有的话就加上这句。
解决办法:
在dao.propertities里面添加:memcache.key.version.Qa_question=1.0.1
为什么添加这行,说明如下:
Dao配置文件 dao.properties,由系统启动加载,系统变量"-Ddao.config.file=文件的绝对路径"
#entity默认的key版本 memcache.key.version.default=1.0.0 #如果一个entity版本变更,需要在配置文件中定义一个key,无须重启,自动生效 #格式:memcache.key.version.{entity的class名字}=版本号 memcache.key.version.User=1.0.1 #memcache client factory class name #如果开启cache,打开下行注释,不启动cache,注释下行 memcache.client.factory=MemcachedClientSpyFactory # Spy Params Config spy.memcached.servers=host1:11211,host2:11311 # Set the default expire time in seconds spy.memcached.defaultExpire=86400 spy.memcached.compressionThreshold=16384 # Set the default operation timeout in milliseconds. spy.memcached.opTimeout=1000
相关推荐
当这个对象被反序列化时,序列化运行时会计算出该类当前的`serialVersionUID`并与序列化文件中的值进行比较,如果不一致,则会抛出`java.io.InvalidClassException`异常。 #### 为什么需要显式声明serialVersionUID...
### Java.io.Serializable 序列化问题详解 #### 一、序列化的概念与作用 在 Java 编程语言中,序列化是一种将对象的状态(即成员变量的值)转换为可以存储或传输的形式的过程。通常,这种形式是字节流,但也可以是...
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.text....
当实现 `java.io.Serializable` 接口的类未明确声明 `serialVersionUID` 时,Java 序列化机制将根据编译后的 Class 文件自动生成一个 `serialVersionUID`。此规则下,即使多次重新编译,只要 Class 文件内容不变...
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import javax....
4. **InvalidClassException**:无效的类异常,通常在反序列化时出现,因为类的版本与序列化时的版本不符。为解决此问题,可以在类上定义一个常量`serialVersionUID`以固定版本号,使序列化和反序列化兼容。 ```...
Java 控制台实现课程表是一个基础的编程项目,它涵盖了数据结构、IO 流和对象序列化的知识。在这个项目中,我们将使用 Java 语言在控制台上创建一个简单的课程表系统,用户可以通过输入命令来实现对课程表的增、删、...
关键代码位于`java.io.ObjectStreamClass#initNonProxy`方法中,该方法会比较类的serialVersionUID以判断是否匹配。 为了绕过这个检查,我们可以尝试破坏以下三个条件之一: 1. 本地和远程类是否都实现了...
如果不定义,Java会自动生成一个,但可能会在升级类结构时导致问题。 3. **序列化对象**:使用`ObjectOutputStream`的`writeObject()`方法将对象写入输出流。 4. **反序列化对象**:使用`ObjectInputStream`的`...
当Java在反序列化时检测到目标类的`serialVersionUID`与原始序列化数据中的`serialVersionUID`不匹配时,会抛出`InvalidClassException`,提示类的序列化版本不一致。默认情况下,JVM会根据类的字段和方法自动生成一...
当反序列化时,如果发现接收到的`serialVersionUID`与当前类的不匹配,就会抛出`InvalidClassException`,提示序列化版本不兼容。 为了确保序列化兼容性,开发者可以在类中显式声明`serialVersionUID`,并赋予一个...
不一致的版本可能导致`serialVersionUID`的差异,从而引发异常。 2. **重新编译和打包**:如果项目中包含了自定义的类,并且这些类的结构发生过更改,那么需要重新编译并确保在打包时使用了最新的类版本。 3. **...
- 版本兼容性:如果序列化时的类结构与反序列化时的类结构不一致,可能会导致异常。应确保序列化和反序列化发生在相同版本的类定义下。 **三、自定义序列化与反序列化** 1. **序列化回调**:可以重写`writeObject...
如果在序列化后修改了类的结构(如添加、删除或修改字段),`serialVersionUID`会改变,导致反序列化时抛出`InvalidClassException`。 多次序列化同一对象到同一个文件,每次都会覆盖之前的序列化数据。如果对象...
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; ...
如果类在序列化后进行了修改,可能导致反序列化失败,除非手动指定`serialVersionUID`以保持一致性。 - ** transient 关键字**: 用于标记不希望序列化的字段。 - **Externalizable 接口**: 除了Serializable接口外,...
为了应对这个问题,可以使用`serialVersionUID`字段,这个字段表示类的序列化版本标识,当类发生改变时,需要更新这个值以避免版本不匹配的异常。 - **安全性问题**:序列化可以被恶意利用,因为反序列化过程中可能...
当类中的字段或方法名改变时,如果不设置 serialVersionUID 值,可能会抛出异常。serialVersionUID 值是根据类名、接口名、成员方法及属性等来生成一个 64 位的哈希字段。显示设置 serialVersionUID 值可以保证版本...
如果手动指定,应保持在序列化和反序列化时一致,否则可能导致`InvalidClassException`。 七、序列化工具 1. `java.io.ObjectOutputStream`和`java.io.ObjectInputStream`:基础的序列化和反序列化工具类。 2. `...
### JAVA导出Excel文件2003版:结合具体框架的实现 #### 一、概述 在企业级应用开发中,导出数据到Excel是一种常见的需求。本文将介绍如何使用Java来导出Excel 2003版本(.xls)文件,并结合具体的框架实现这一功能...