serialversionuid(serialVersionUID 谁能解释下 他是干什么用的)

:暂无数据 2026-09-18 03:30:02 :0

serialversionuid(serialVersionUID 谁能解释下 他是干什么用的)

今天给各位分享serialVersionUID 谁能解释下 他是干什么用的的知识,其中也会对serialVersionUID 谁能解释下 他是干什么用的进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录

serialVersionUID 谁能解释下 他是干什么用的

serialVersionUID 用来表明类的不同版本间的兼容性

简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。

如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本,未作更改的类,就需要显式地定义一个名为serialVersionUID,类型为long的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。

java怎么自动生成serializable

自己写一个java实体类,implements了Serializable接口,让serialversionUID自动生成方法:

  1. 点击类旁边的警告符号;

   2.选择Add generated serial version ID即可自动生成。

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();
  }

  …..

}

serialVersionUID是什么

serialVersionUID:意思是序列化的版本号。

【作用】一些java类中为什么需要重载 serialVersionUID 属性。在Java中,软件的兼容性是一个大问题,尤其在使用到对象串行性的时候,那么在某一个对象已经被串行化了,可是这个对象又被修改后重新部署了,那么在这种情况下, 用老软件来读取新文件格式虽然不是什么难事,但是有可能丢失一些信息。serialVersionUID来解决这些问题,新增的serialVersionUID必须定义成下面这种形式:static final long serialVersionUID=-2805284943658356093L;。其中数字后面加上的L表示这是一个long值。 通过这种方式来解决不同的版本之间的串行话问题。

【生成方式】它有两种显示的生成方式:
一个是默认的1L,比如:private static final long serialVersionUID = 1L;。
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = xxxxL。

如何获得serialVersionUID的值

呵呵,很简单呀

1,
你把private改成public

然后就可以获得了,但这样的话,你可能把这个属性暴露出去让外部程序进行赋值(虽然它并不能被赋值,因为它有final修饰,编译器会报错)

2.
你写个方法叫做getSerialVersionUID(),返回这个值,这样就解决了1中出现的问题.

serialVersionUID有什么作用

serialVersionUID作用:
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
有两种生成方式:
一个是默认的1L,比如:private static final long serialVersionUID = 1L;
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:
private static final long serialVersionUID = xxxxL;
当你一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个
提示功能告诉你去定义 。在Eclipse中点击类中warning的图标一下,Eclipse就会
自动给定两种生成的方式。如果不想定义它,在Eclipse的设置中也
可以把它关掉的,设置如下:
Window ==》 Preferences ==》 Java ==》 Compiler ==》 Error/Warnings ==》
Potential programming problems
将Serializable class without serialVersionUID的warning改成ignore即可。
如果你没有考虑到兼容性问题时,就把它关掉,不过有这个功能是好的,只要任何类别实现了Serializable这个接口的话,如果没有加入
serialVersionUID,Eclipse都会给你warning提示,这个serialVersionUID为了让该类别
Serializable向后兼容。
如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。
但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,可避开不兼容性问题。

关于serialversionuid和serialVersionUID 谁能解释下 他是干什么用的的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

serialversionuid(serialVersionUID 谁能解释下 他是干什么用的)

本文编辑:admin

更多文章:


python语言程序设计是什么(python语言是什么)

python语言程序设计是什么(python语言是什么)

各位老铁们好,相信很多人对python语言程序设计是什么都不是特别的了解,因此呢,今天就来为大家分享下关于python语言程序设计是什么以及python语言是什么的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

2026年10月15日 12:00

windows程序设计第五版(《WINDOWS程序设计》和《WINDOWS核心编程》的区别)

windows程序设计第五版(《WINDOWS程序设计》和《WINDOWS核心编程》的区别)

本篇文章给大家谈谈windows程序设计第五版,以及《WINDOWS程序设计》和《WINDOWS核心编程》的区别对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了

2026年10月15日 11:30

issued retroactively(FORM E上盖“ISSUED RETROACTIVELY”的问题,小女在线等待)

issued retroactively(FORM E上盖“ISSUED RETROACTIVELY”的问题,小女在线等待)

各位老铁们,大家好,今天由我来为大家分享issued retroactively,以及FORM E上盖“ISSUED RETROACTIVELY”的问题,小女在线等待的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站

2026年10月15日 10:30

f发音是什么?printf的返回值是什么

f发音是什么?printf的返回值是什么

大家好,关于f很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于f发音是什么的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

2026年10月15日 10:10

begin和start的区别(start与begin的区别)

begin和start的区别(start与begin的区别)

其实begin和start的区别的问题并不复杂,但是又很多的朋友都不太了解start与begin的区别,因此呢,今天小编就来为大家分享begin和start的区别的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月15日 09:20

vant官网中文(范特365 是韩国化妆品VANT36.5吗)

vant官网中文(范特365 是韩国化妆品VANT36.5吗)

大家好,今天小编来为大家解答以下的问题,关于vant官网中文,范特365 是韩国化妆品VANT36.5吗这个很多人还不知道,现在让我们一起来看看吧!

2026年10月15日 09:10

特殊字符是指什么?正则表达式中一些特殊字符的用法

特殊字符是指什么?正则表达式中一些特殊字符的用法

大家好,特殊字符相信很多的网友都不是很明白,包括特殊字符是指什么也是一样,不过没有关系,接下来就来为大家分享关于特殊字符和特殊字符是指什么的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

2026年10月15日 08:10

特殊符号网名大全花样符号(特殊符号昵称有哪些)

特殊符号网名大全花样符号(特殊符号昵称有哪些)

本篇文章给大家谈谈特殊符号网名大全花样符号,以及特殊符号昵称有哪些对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年10月15日 07:30

prison break(越狱(prison break)到底是在讲个什么)

prison break(越狱(prison break)到底是在讲个什么)

各位老铁们好,相信很多人对prison break都不是特别的了解,因此呢,今天就来为大家分享下关于prison break以及越狱(prison break)到底是在讲个什么的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看

2026年10月15日 06:50

c程序设计第五版教学视频(求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!)

c程序设计第五版教学视频(求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!)

各位老铁们,大家好,今天由我来为大家分享c程序设计第五版教学视频,以及求C程序设计(第五版)谭浩强教材源代码、视频课件等电子版资料!谢谢大家!的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动

2026年10月15日 06:40

最近更新

issued retroactively(FORM E上盖“ISSUED RETROACTIVELY”的问题,小女在线等待)
2026-10-15 10:30:03 浏览:0
热门文章

标签列表