我目前正在测试远程演员在Android和Windows之间进行通信.Actors远程发送不同的类,我设置serialVersionUID.
这是我的序列化类的代码:
@SerialVersionUID(13.asInstanceOf[Long]) case class IdentifyMessage(userName : String, user : User, code : Int)
Run Code Online (Sandbox Code Playgroud)
问题是远程actor调试说不兼容的类存在问题:
caught java.io.InvalidClassException: scala.actors.remote.Node; local class incompatible:
stream classdesc serialVersionUID = -6610463074147725500, local class serialVersionUID = -7525549079045563153
Run Code Online (Sandbox Code Playgroud)
为什么我的SerialVersionUID对编译器无关紧要?
如何修复serialVersionUID?或者可能还有另一个问题?
谢谢
我在数据库中保存了一个java对象,然后几天后我改变了我的jre版本.现在,当我试图读取同一个对象时,我得到以下异常:
Exception in thread "main" java.io.InvalidClassException:
SerializeMe; local class incompatible: stream classdesc
serialVersionUID = -6377573678240024862, local class serialVersionUID = -8204757486033751616
Run Code Online (Sandbox Code Playgroud)
我怎样摆脱这个,我怎样才能得到保存的对象?
请帮我.
我想通过生成自动序列版本ID来删除某些类的一些警告.在Eclipse中,这很简单 - IDE可以自动生成一个并将其添加到类中.但是,我在NetBeans中看不到此功能.是可用的么?如果是的话,它在哪里?如果没有,是否有可以启用它的插件?
我正在尝试学习序列化如何与Java及其最新版本一起使用.我正在尝试序列化这样的lambda:
Runnable r = (Runnable & Serializable)() -> {System.out.println("This is a test");};
Run Code Online (Sandbox Code Playgroud)
但我注意到我没有关于缺少serialVersionUID变量的警告.这是正常的吗?
我知道它将在运行时生成,但强烈建议您定义它:https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html
如果可序列化类未显式声明serialVersionUID,则序列化运行时将基于类的各个方面计算该类的默认serialVersionUID值,如Java(TM)对象序列化规范中所述.但是,强烈建议所有可序列化类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类细节高度敏感,这些细节可能因编译器实现而异,因此在反序列化期间可能导致意外的InvalidClassExceptions.因此,为了保证跨不同java编译器实现的一致的serialVersionUID值,可序列化类必须声明显式的serialVersionUID值.强烈建议显式serialVersionUID声明尽可能使用private修饰符,因为此类声明仅适用于立即声明的类 - serialVersionUID字段作为继承成员无用.数组类不能声明显式的serialVersionUID,因此它们始终具有默认的计算值,但是对于数组类,不需要匹配serialVersionUID值.
我该怎么办 ?如何在Lambda中定义它?
谢谢
我与一位同事讨论了可序列化类的serialVersionUID:他总是从a开始,serialVersionUID = 1L然后在对类进行一些重大更改时将其递增1.
JDK类似乎总是在类中使用更复杂的生成的serialVersionUID java.lang.String:
private static final long serialVersionUID = -6849794470754667710L;
Run Code Online (Sandbox Code Playgroud)
现在,我的同事询问这种serialVersionUID与简单的serialVersionUID(如1L,2L,3L ......)相比的优势?
我们还搜索了SOF,但对给出的答案不是很满意,例如在为什么生成long serialVersionUID而不是简单的1L?.
在我看来,使用生成的ID的优点是它不需要任何有关"旧"类版本的信息.但是当手动递增ID时,您必须知道到目前为止的最高值.这可能听起来微不足道(通过查看当前的serialVersionUID并将其增加1),但在更大的软件项目,更大的开发团队或分布式环境中可能更复杂.
我不知道在Java中在哪里使用默认的serialVersionUID或生成的serialVersionUID?
private static final long serialVersionUID = 4125965356358329466L; // generated
private static final long serialVersionUID = 1L; // default
Run Code Online (Sandbox Code Playgroud) 是否有maven插件自动计算和更新实现Serializable接口的所有java类文件的串行版本uid?
假设这是我的课:
class B implements Serializable {
private static final long serialVersionUID = -5186261241138469827L; // what algo is used to generate this
..........
}
Run Code Online (Sandbox Code Playgroud)
eclipse使用什么算法生成serialVersionUID = -5186261241138469827L?
为什么我们在扩展 RuntimeException 时需要 serialVersionUID?RuntimeException 是一个可序列化的类吗?
public class DataNotFoundException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = 1;
public DataNotFoundException(String str)
{
super(str);
}
}
Run Code Online (Sandbox Code Playgroud) 如果我有这样的课程:
public class Name implements Serializable {
private final String firstName;
private final String lastName;
public Name(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我添加另一个方法(并没有其他字段),它的计算的serialVersionUID会改变吗?
例如,添加方法:
public String getFullName() {
return firstName + " " + lastName;
}
Run Code Online (Sandbox Code Playgroud)
或者,是否有一个很好的工具来解决这个问题?
serialversionuid ×10
java ×9
eclipse ×1
java-8 ×1
lambda ×1
maven-2 ×1
maven-plugin ×1
netbeans ×1
scala ×1
serializable ×1