我有一个EJB客户机和一个运行在JBoss 4 server
上的EJB2服务器。它在相同的JVM版本(1.6)中工作得很好。然后我将客户端JVM升级到1.7(但编译器版本是1.6),同时保持服务器JVM相同(1.6)。如果服务器方法返回一个对象或抛出异常,客户端发生java.io.StreamCorruptedException: unexpected end of block data
错误。但是服务器端功能的执行没有任何错误。此服务器模块中的所有方法调用都会发生这种情况。但也有一些其他的服务器模块是正常工作的。对这个问题有什么想法吗?
编辑:-如果返回类型是新创建的类,它可以正常工作
我有这个问题,现在这样做:
import org.apache.commons.io.IOUtils;
byte[] bytes;
try {
bytes = IOUtils.toByteArray(uploadedFile.getInputstream());
image.setContent(bytes);
imageService.save(image);
} catch (IOException ex) {
...
}
您最可能使用Java序列化来进行客户机和服务器之间的通信。
要使Java序列化正常工作,客户机和服务器都需要具有兼容版本的类文件(我也认为Java没有保证序列化类型在版本之间兼容,但我现在找不到任何相关文档)。
当你有不同版本的Java时,很可能一些类可能有不同的结构(例如Throwable
(Exception
的超类),它在Java7中有新的字段suppressedExceptions
)。通常,序列化会尝试为此抛出有意义的异常,但在某些情况下,它可能会失败,只抛出StreamCorruptedException
.