标签: serialversionuid

Java外部化serialVersionUID

如果我实现Externalized,我是否需要在该类中指定serialVersionUID以实现版本兼容性?

换句话说,Java 在反序列化Externalized 对象时是否检查serialVersionUID?

java serialversionuid

4
推荐指数
1
解决办法
2550
查看次数

可以在1.7中序列化HashMap,在1.6中使用吗?

我认为这会引发错误,说明版本号较小; 但事实并非如此.并且工作正常.任何人都可以指出,为什么这有效?

我在java 1.7上运行的应用程序中创建了一个hashMap,将其序列化并使用jdk 1.6将其发送到应用程序.接收器应用程序能够无任何错误地获取内容.

java serialization serialversionuid deserialization

4
推荐指数
1
解决办法
434
查看次数

Java SerialVersionUid是1L还好吗?还是需要独一无二的?

我有两个实现Serializable的java类.我将它们都设置为1L的serialVersionUid.

同事说所有类必须具有唯一的串行版本uid,并且如果jvm具有相同的串行版本uid,则jvm将把类视为相等.我认为相等是基于equals方法的结果而不是串行版本uid.

我的理解是,串行版本uid用于指示类的版本,并且当类以不兼容的方式更改时,串行版本的uid应该递增.

那是对的吗?是否可以使用1的serialversion uid?或者java类从来没有1L的serialversion uid?

java serialization serialversionuid

4
推荐指数
1
解决办法
1363
查看次数

如果我更改Java Exception类扩展的基类,是否需要更新serialVersionUID值?

请考虑以下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)

java serialization exception serialversionuid

3
推荐指数
1
解决办法
1827
查看次数

为什么serialVersionUID字段存在?

它让我从Serializable界面的启动中感到困惑,为什么我必须在我的所有课程中加入这个领域.我知道这个接口需要一个唯一的标识符来标记类,但为什么它们不能在运行时生成它.例如,他们可以使用完全限定类名的MD5哈希或者用于处理罕见事件中的重复项的类似方法来生成它(也就是说,我确定,当被要求生成id时,eclipse会做什么).

所以我要问的是(这篇文章不仅仅是对标准库的咆哮)究竟是如何使用框架化序列化字段的?

我想知道的原因是因为我将尝试创建一个Aspect(使用AspectJ或其他语言),它将使用MD5哈希添加serialVersionUID字段,并且能够以API可接受的方式处理冲突.

如果我能让它发挥作用,我会发布结果.

java serializable serialversionuid aspects

3
推荐指数
1
解决办法
1906
查看次数

否定serialVersionUID?

我遇到了一个异常处理程序类,它扩展了异常,如下所示:

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 serialization serialversionuid

3
推荐指数
1
解决办法
1961
查看次数

序列版本UID 不匹配

在此输入图像描述

我对 java 相当陌生,我有一个类ProductsSerializable. 我不知道我做了什么,但我的程序停止工作并给了我这个错误:

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)

java serialization serialversionuid

3
推荐指数
1
解决办法
7900
查看次数

如何从命令行生成 Java 文件的串行版本 UID?

背景

我试图在Eclipse 中生成我的 java 文件的 serialVersionUID,但得到Eclipse 中描述的错误:无法生成串行版本 ID。我已按照该问题中的说明进行操作,但我没有丢失路径文件,但仍然出现相同的错误。此外,我必须使用随机生成的 serialVersionUID(尽管通常只使用 1L 是可以的),因为这是我的项目的要求。

问题

由于我的日食不合作,我正在尝试命令行解决方案。我发现的命令serialver不会生成 serialVersionUID。根据如何生成 SerialVersionUID serialver 应该在文件中生成一个 serialVersionUID:

  1. 串行命令

JDK 有一个名为“serialver”的内置命令来自动生成 serialVersionUID。在此示例中,您使用“serialver”为 Address 类生成一个 serialVersionUID。

 E:\workspace\target\classes>serialver Address Address:    static final
    long serialVersionUID = -687991492884005033L;
Run Code Online (Sandbox Code Playgroud)

但是,我在类目录中的一个类上运行了这个命令,终端返回了这个错误:

Class Classname.java not found.
Run Code Online (Sandbox Code Playgroud)

无论我是在终端中输入serialver Classname还是输入,都会出现此错误serialver Classname.java。我还在与文件相同的目录中运行它,但错误仍然存​​在。

如何serialver在 Linux 命令行中使用,设置 Java 文件的 serialVersionUID?如果serialver不是我应该使用的命令,哪个命令(或一系列命令)是正确的方法?

澄清

我想从命令行在我的文件中生成并分配一个 serialVerionUID ,因此如何在 Java 中以编程方式 …

java linux serialversionuid

3
推荐指数
1
解决办法
2884
查看次数

特殊标识符:serialVersionUID 和 serialPersistentFields

我了解这些字段是什么以及如何使用它们,但我想知道:

Java 编译器如何在其编译步骤中实际处理这样的特殊字段?它真的只根据名称查找变量吗?

这看起来很像非 Java... 除了serialVersionUIDand 之外serialPersistentFields,还有其他的吗?

java serialization javac serialversionuid

3
推荐指数
1
解决办法
100
查看次数

即使设置了serialVersionUID,反序列化也会引发InvalidClassException

不久前,我发布了一个序列化/反序列化用户对象的应用程序。

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 android proguard serialversionuid deserialization

2
推荐指数
1
解决办法
1042
查看次数