Java 在客户端使用额外变量进行序列化和反序列化,但版本id相同
假设我在服务器端有一个类,有两个变量Java 在客户端使用额外变量进行序列化和反序列化,但版本id相同,java,serialization,deserialization,Java,Serialization,Deserialization,假设我在服务器端有一个类,有两个变量 class A implements Serializable { public static final long serialVersionUID = 1234; String a; String b; } 在客户端,我有三个变量的同一个类,但版本id相同 class A implements Serializable { public static final long serialVersionUID = 1234;
class A implements Serializable {
public static final long serialVersionUID = 1234;
String a;
String b;
}
在客户端,我有三个变量的同一个类,但版本id相同
class A implements Serializable {
public static final long serialVersionUID = 1234;
String a;
String b;
String c;
}
这里发生了什么?对它的行为有点困惑。这是一个错误。如果没有收到额外的值,则会将其丢弃;如果没有收到额外的值,则会将其设置为默认值。到底会发生什么,会将其丢弃还是设置为默认值。@VinaySJain我已经完全详细地回答了这个问题。你只是想让我重复一遍。@Thilo不。如果你破坏了
serialVersionUID
,你的自定义read/writeObject()
方法将永远无法执行ObjectInputStream
将抛出一个。这就是为什么你不应该碰它。@Thilo的确,这个答案是完全错误的。正如EJP已经指出的那样,不仅当serialVersionUID不匹配时,您不会走那么远(到readObject
方法),而且readObject
方法也无法找到流的类描述符具有哪个serialVersionUID。但是,由于您通常只会到达该点,因此当数字匹配时,无需查询该数字。你可以用ObjectInputStream
的子类玩特技,但那是一个完全不同的故事…@Thilo我必须纠正自己。如果调用了readObject
方法,可以找到流的serialVersionUID
,但是对于标准的ObjectInputStream
,如果数字不匹配,则无法到达该点。