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
,如果数字不匹配,则无法到达该点。