如果我实现Externalized,我是否需要在该类中指定serialVersionUID以实现版本兼容性?
换句话说,Java 在反序列化Externalized 对象时是否检查serialVersionUID?
我认为这会引发错误,说明版本号较小; 但事实并非如此.并且工作正常.任何人都可以指出,为什么这有效?
我在java 1.7上运行的应用程序中创建了一个hashMap,将其序列化并使用jdk 1.6将其发送到应用程序.接收器应用程序能够无任何错误地获取内容.
我有两个实现Serializable的java类.我将它们都设置为1L的serialVersionUid.
同事说所有类必须具有唯一的串行版本uid,并且如果jvm具有相同的串行版本uid,则jvm将把类视为相等.我认为相等是基于equals方法的结果而不是串行版本uid.
我的理解是,串行版本uid用于指示类的版本,并且当类以不兼容的方式更改时,串行版本的uid应该递增.
那是对的吗?是否可以使用1的serialversion uid?或者java类从来没有1L的serialversion uid?
请考虑以下Java异常类:
public class BarException extends RuntimeException {
// [...]
}
public class FooException extends BarException {
private static final long serialVersionUID = -5322002268075295537L;
// [...]
}
Run Code Online (Sandbox Code Playgroud)
如果我希望更新要删除的继承层次结构BarException,FooException直接从中派生RuntimeException,这是否需要更改serialVersionUID值?
// FooException with updated inheritance hierarchy
public class FooException extends RuntimeException {
private static final long serialVersionUID = ???;
// [...]
}
Run Code Online (Sandbox Code Playgroud) 它让我从Serializable界面的启动中感到困惑,为什么我必须在我的所有课程中加入这个领域.我知道这个接口需要一个唯一的标识符来标记类,但为什么它们不能在运行时生成它.例如,他们可以使用完全限定类名的MD5哈希或者用于处理罕见事件中的重复项的类似方法来生成它(也就是说,我确定,当被要求生成id时,eclipse会做什么).
所以我要问的是(这篇文章不仅仅是对标准库的咆哮)究竟是如何使用框架化序列化字段的?
我想知道的原因是因为我将尝试创建一个Aspect(使用AspectJ或其他语言),它将使用MD5哈希添加serialVersionUID字段,并且能够以API可接受的方式处理冲突.
如果我能让它发挥作用,我会发布结果.
我遇到了一个异常处理程序类,它扩展了异常,如下所示:
public class AppFileReaderException extends Exception {
//Explicit serialization UID added
private static final long serialVersionUID = -2458461415998318236L;
public AppFileReaderException(String msg)
{
super(msg);
}
Run Code Online (Sandbox Code Playgroud)
作者使用了显式序列化版本UID,并在其他类似的异常处理程序类中忽略了它.基于我从另一篇SO帖子中理解的内容,如果应用程序没有使用任何序列化和反序列化,我们可以忽略序列化UID.奇怪的是,作者使用了否定的UID.我很想知道这是有效还是推荐的做法.有没有其他理由使用负序列版本的VID?

我对 java 相当陌生,我有一个类Products是Serializable. 我不知道我做了什么,但我的程序停止工作并给了我这个错误:
Exception in thread "main" java.io.InvalidClassException: cockeb.Product;
local class incompatible: stream classdesc serialVersionUID = 1288455942608122525,
local class serialVersionUID = -558553967080513790
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1829)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1986)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
at java.util.ArrayList.readObject(ArrayList.java:791)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1058)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2122)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2013)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422
Run Code Online (Sandbox Code Playgroud)
我四处搜寻并找到了声明它的方法,但这现在对我没有帮助。我什至打开一个新项目,只是从非工作项目中复制每个类中的文本并将其粘贴到新项目中,但我仍然遇到相同的错误。我在我的所有项目中都遇到了这个错误(它们使用同一个Serializable类),我需要知道我做了什么来做到这一点,这样它就不会再次发生,以及我可以做些什么来修复它。我已经尝试声明了,serialversionUID但没有成功。
产品类别
package cockeb;
import java.io.Serializable;
import java.math.BigDecimal;
public class Product implements Comparable<Product>, Serializable {
private …Run Code Online (Sandbox Code Playgroud) 我试图在Eclipse 中生成我的 java 文件的 serialVersionUID,但得到Eclipse 中描述的错误:无法生成串行版本 ID。我已按照该问题中的说明进行操作,但我没有丢失路径文件,但仍然出现相同的错误。此外,我必须使用随机生成的 serialVersionUID(尽管通常只使用 1L 是可以的),因为这是我的项目的要求。
由于我的日食不合作,我正在尝试命令行解决方案。我发现的命令serialver不会生成 serialVersionUID。根据如何生成 SerialVersionUID serialver 应该在文件中生成一个 serialVersionUID:
- 串行命令
JDK 有一个名为“serialver”的内置命令来自动生成 serialVersionUID。在此示例中,您使用“serialver”为 Address 类生成一个 serialVersionUID。
Run Code Online (Sandbox Code Playgroud)E:\workspace\target\classes>serialver Address Address: static final long serialVersionUID = -687991492884005033L;
但是,我在类目录中的一个类上运行了这个命令,终端返回了这个错误:
Class Classname.java not found.
Run Code Online (Sandbox Code Playgroud)
无论我是在终端中输入serialver Classname还是输入,都会出现此错误serialver Classname.java。我还在与文件相同的目录中运行它,但错误仍然存在。
如何serialver在 Linux 命令行中使用,设置 Java 文件的 serialVersionUID?如果serialver不是我应该使用的命令,哪个命令(或一系列命令)是正确的方法?
我想从命令行在我的文件中生成并分配一个 serialVerionUID ,因此如何在 Java 中以编程方式 …
我了解这些字段是什么以及如何使用它们,但我想知道:
Java 编译器如何在其编译步骤中实际处理这样的特殊字段?它真的只根据名称查找变量吗?
这看起来很像非 Java... 除了serialVersionUIDand 之外serialPersistentFields,还有其他的吗?
不久前,我发布了一个序列化/反序列化用户对象的应用程序。
public String serializeUser(final User user) {
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
final ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(user);
objectOutputStream.close();
} catch (final IOException exception) {
...
}
return new String(Base64.encode(byteArrayOutputStream.toByteArray(), DEFAULT));
}
public User deserializeString(final String userString) {
final byte userBytes[] = Base64.decode(userString.getBytes(), DEFAULT);
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(userBytes);
final ObjectInputStream objectInputStream;
final User user;
try {
objectInputStream = new ObjectInputStream(byteArrayInputStream);
user = (User) objectInputStream.readObject();
objectInputStream.close();
} catch (final IOException | ClassNotFoundException exception) {
... …Run Code Online (Sandbox Code Playgroud) java ×10
serialversionuid ×10
android ×1
aspects ×1
exception ×1
javac ×1
linux ×1
proguard ×1
serializable ×1