java类中serialversionuid 作用 是什么?举个例子说明.

如题所述

类中影响Serialization进程的特征,两边的操作使用的类版本不同,但它们的 serialVersionUID 必须是一样的。它是用来识别两边的类是否兼容的,两边不同时不应该继续还原状态,而是应该停止下来,因为有人把事情搞错了。如果你的类没有实现 java.io.Serializable 或 java.io.Externalizable,这个字段则没有意义。


如果你没听说过 Java Serialization (序列化,有人书翻译成串行化),那去找些 serialization 介绍看看,下面说的第2段类结构变化时是中级水平的,理解 Java 的一些细节才能理解,多数情况下人们只提到第一种情况(类的结构没有变化时),也只需要第一种情况。


当Serialization两端(比如Socket两端)使用一个类的不同版本时,我们必须提供 serialVersionUID,它可以用JDK自带的 serialver 命令行来计算:

private static final long serialVersionUID = xxxx ;


如果类中出现了下面两个方法,那么将会被用到,否则使用默认的实现:

private void readObject(ObjectInputStream) throws    IOException,ClassNotFoundException;

private void writeObject(ObjectOutputStream)throws  IOException;

记住这里出现的方法和字段都是 private.


新版本中仅增加了字段或方法而没有改变旧版本中已有的东西时,我们只要保证两个版本中的 serialVersionUID 是一样的就行了.


具体样例可以看 JDK 源码中的像 ArrayList 这些类的代码的 readObject 和 writeObject 方法。


类的结构有些变化时,新版本对旧版本中某些东西进行了删减时, Field 的变化我们需要在readObject和writeObject方法中进行处理

ObjectOutputStream.PutField 类可达到这个目的

只是保证两个版本中的 serialVersionUID 一致是行不通的

类中必需两个常量:

private static final long                serialVersionUID;

private static final ObjectStreamField[] serialPersistentFields


下面样例是当客户端和服务端使用的类的版本不同并且类的结构也改变了,比如:

对方使用的类 Entry 是:
public class Entry12 ... {
   private String name, email;
   private static final long serialVersionUID = 12L;
}
现在我们改变了类的设计了:
public class Entry12 ... {
   private EntryInternal basic;
   private static final long serialVersionUID = 12L;
   private class EntryInternal {
         private String name, email;
   }
}


 /*  这是一段代码片段,我们假设新版本的类 name & email 两个字段进行了修改
  * (这里我们放到一个内部类EntryInternal 中),而旧版本中直接属于这个类.
  * 
  *  请注意这里的字段和方法的签名, 它们都是 private 的或者是常量.
  */
public class Entry12 implements Serializable {
  private EntryInternal                    pair                   = new EntryInternal();

  /* 这是必要的,因为版本不同 */
  private static final long                serialVersionUID       = 12L;

  ** 这也是必要的,否则写 putFields 时会抛出异常.
   * This field will be used by {@link #writeObject(ObjectOutputStream)},
   * if this field is missing, follwing exception will be threw when invoke 
   * {@link java.io.ObjectOutputStream.PutField#put(String,)} :
   *   an exception ‘java.lang.IllegalArgumentException: No such object field’  will be threw.
   */
  private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[] {
      new ObjectStreamField("name" , String.class),//
      new ObjectStreamField("email" , String.class),//  
                                                                  };
 /* 我们在这里不是直接写出字段,而把要写出的字段包装起来,
    我们按需交换字段,而不是直接读写pair 这个字段. 
 */
  private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException {
    ObjectInputStream.GetField getFields = input.readFields();

    /* 请注意:使用 Serializable 进行交换时不使用构造方法,所以这时 pair 还未初始化. */
    pair = new EntryInternal();

    pair.name = (String) getFields.get("name", null);
    pair.email = (String) getFields.get("email", null);
  }

  /* 写出时跟读入时一样 */
  private void writeObject(ObjectOutputStream output) throws IOException {
    ObjectOutputStream.PutField putFields = output.putFields();

    putFields.put("name", pair == null ? null : pair.name);
    putFields.put("email", pair == null ? null : pair.email);

    output.writeFields();
  }

  …..

}

温馨提示:内容为网友见解,仅供参考
无其他回答

java类中serialversionuid 作用 是什么?举个例子说明.
类中影响Serialization进程的特征,两边的操作使用的类版本不同,但它们的 serialVersionUID 必须是一样的。它是用来识别两边的类是否兼容的,两边不同时不应该继续还原状态,而是应该停止下来,因为有人把事情搞错了。如果你的类没有实现 java.io.Serializable 或 java.io.Externalizable,这个字段则没有意义...

serialversionuid的作用
serialversionuid的作用:答:serialversionuid的作用是验证版本一致性。如果serialversionuid一致,说明他们的版本是一样的。反之,就说明版本不同,就无法运行或使用相关功能。1、serialversionuid是java中的一种序列化机制。2、当我们进行序列化操作时,会把当前的版本写入到文件之中。3、在运行的时候,它...

serialversionuid的作用
1、serialVersionUID意思是序列化的版本号作用一些java类中为什么需要重载 serialVersionUID 属性在Java中,软件的兼容性是一个大问题,尤其在使用到对象串行性的时候,那么在某一个对象已经被串行化了,可是这个对象又被。2、serialVersionUID作用是序列化时保持版本的兼容性,即在版本升级时反序列化仍保持...

serialVersionUID是什么?
serialVersionUID是Java中的一个标识符,用于标识序列化类的版本。在Java中,当一个类实现了Serializable接口,即该类可以被序列化时,serialVersionUID就成了一个非常重要的属性。序列化是将对象的状态转换为字节流,以便于存储和传输。反序列化则是将这个字节流恢复为对象。在这个过程中,serialVersionUID...

serialversionuid有什么作用?
serialVersionUID的作用是确保序列化与反序列化的一致性和兼容性。以下是关于serialVersionUID的 当一个对象被序列化时,其状态被转换为一组字节流,以便可以将这些字节流传输到其他运行着相同程序的计算机或重新创建对象。为了确保序列化的对象在反序列化时能够正确地重建,Java提供了serialVersionUID的概念。

serialVersionUID有什么作用?
serialVersionUID作用: 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。有两种生成方式: 一个是默认的1L,比如:private static final long serialVersionUID = 1L; 一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如: private static...

serialVersionUID 谁能解释下 他是干什么用的
serialVersionUID 用来表明类的不同版本间的兼容性 简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会...

serialVersionUID有什么作用?
在序列化过程中,serialVersionUID的作用至关重要。它确保了版本间的兼容性,即使在类升级时,反序列化操作仍能正确识别对象的独特标识。主要有两种生成方式:一是默认设置为1L,如private static final long serialVersionUID = 1L;二是根据类名、接口、方法和属性生成一个64位哈希字段,例如:private ...

serialVersionUI
在Java编程中,serialVersionUID是一个至关重要的概念,它代表着序列化的版本号。其核心作用是确保在类发生修改后,旧版本的程序能够正确处理新版本对象的序列化数据,避免信息丢失。当一个对象被串行化后,如果类结构发生变化,没有serialVersionUID,旧软件可能会遇到格式不匹配的问题。为解决这个问题,...

serialVersionUID是什么?
serialVersionUID:意思是序列化的版本号。【作用】一些java类中为什么需要重载 serialVersionUID 属性。在Java中,软件的兼容性是一个大问题,尤其在使用到对象串行性的时候,那么在某一个对象已经被串行化了,可是这个对象又被修改后重新部署了,那么在这种情况下, 用老软件来读取新文件格式虽然不是什么...

相似回答