`

serialVersionUID = -8204063374280945416L;

阅读更多
serialVersionUID


实现java.io.Serializable这个接口是为序列化,serialVersionUID的作用: serialVersionUID 用来表明类的不同版本间的兼容性

实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。

实现后如果你用的是工具的话会出来警告,他会提示你,可以自动生成private static  final  long  serialVersionUID  =  1L;
为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义.  
在JDK中,可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID,如对于Test.class可执行如下命令:serialver Test。

这样,即使某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化。否则,如果不显式定义该属性,这个属性值将由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往往不同,从而造成对象的反序列化因为类版本不兼容而失败。

不显式定义这个属性值的另一个坏处是,不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同,从而造成虽然类没有改变,但是因为JVM不同,出现因类版本不兼容而无法正确反序列化的现象出现。
当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。

最后的建议是,如果我们开发大量需要序列化的类的时候,我们最好还是还原为原来的设置。这样可以保证系统的性能和健壮。

关于serialVersionUID的解释 

serialVersionUID作用:
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。

你可以随便写一个,在Eclipse中它替你生成一个,有两种生成方式:
一个是默认的1L,比如:private static final long serialVersionUID = 1L;
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = -8940196742313994740L;之类的。
Eclipse提示The serializable class XXX does not declare a static final serialVersionUID field of type long
那是Eclipse提供这个提示功能给你吧.
你点它warning的icon两下Eclipse就会自动给定.
如果你不喜欢,可以把它关掉,
windows -> preferences -> 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.
这个可以避开不兼容性的问题.

异常状态:
The serializable class XXX does not declare a static final serialVersionUID field of type long














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

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

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



实现java.io.Serializable这个接口是为序列化,serialVersionUID 用来表明实现序列化类的不同版本间的兼容性。如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。

实现后如果你用的是工具的话会出来警告,他会提示你,可以自动生成private static  final  long  serialVersionUID  =  1L;
为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入private static final long serialVersionUID这个属性,具体数值自己定义.  
在JDK中,可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID,如对于Test.class可执行如下命令:serialver Test。

这样,即使某个类在与之对应的对象已经序列化出去后做了修改,该对象依然可以被正确反序列化。否则,如果不显式定义该属性,这个属性值将由JVM根据类的相关信息计算,而修改后的类的计算结果与修改前的类的计算结果往往不同,从而造成对象的反序列化因为类版本不兼容而失败。

不显式定义这个属性值的另一个坏处是,不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同,从而造成虽然类没有改变,但是因为JVM不同,出现因类版本不兼容而无法正确反序列化的现象出现。
当我们的系统不太经常需要序列化类时,可以去掉这些警告,做如下设置:Window-->Preferences-->Java,将serializable class without serialVersionUID的设置由warning改为Ignore。然后Eclipse会重新编译程序,那些警告信息也就消失了。

最后的建议是,如果我们开发大量需要序列化的类的时候,我们最好还是还原为原来的设置。这样可以保证系统的性能和健壮。

关于serialVersionUID的解释 

serialVersionUID作用:
序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。

你可以随便写一个,在Eclipse中它替你生成一个,有两种生成方式:
一个是默认的1L,比如:private static final long serialVersionUID = 1L;
一个是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如:private static final long serialVersionUID = -8940196742313994740L;之类的。
Eclipse提示The serializable class XXX does not declare a static final serialVersionUID field of type long
那是Eclipse提供这个提示功能给你吧.
你点它warning的icon两下Eclipse就会自动给定.
如果你不喜欢,可以把它关掉,
windows -> preferences -> 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.
这个可以避开不兼容性的问题.

异常状态:
The serializable class XXX does not declare a static final serialVersionUID field of type long
分享到:
评论

相关推荐

    serialVersionUID作用全面解析

    在 Java 序列化机制中,serialVersionUID 有两种显示的生成方式:一是默认的 1L,二是根据类名、接口名、成员方法及属性等来生成一个 64 位的哈希字段。 下面是一个简单的示例代码,演示了 serialVersionUID 在应用...

    hibernate2

    private static final long serialVersionUID = -5596241291862147220L; private int id; private String name; private int age; @Id public int getId() { return id; } public void setId(int id) { ...

    Java中serialVersionUID的解释

    那么,serialVersionUID 有两种生成方式:一种是默认的 1L,例如:private static final long serialVersionUID = 1L;另一种是根据类名、接口名、成员方法及属性等来生成一个 64 位的哈希字段,例如:private static...

    详述IntelliJ IDEA 中自动生成 serialVersionUID 的方法(图文)

    在生成 serialVersionUID 时,可以选择两种方式,一种是采用默认的 1L,即 private static final long serialVersionUID = 1L; 另一种是根据类名、接口名、成员方法及属性等来生成一个 64 位的哈希字段,例如 ...

    java struts2接收参数的几种方法

    private static final long serialVersionUID = -7463970150000893325L; private String name; public void execute() { System.out.println(name + ":" + name); } public String getName() { return name...

    java类中serialVersionUID详解.pdf

    1. **默认生成**:如 `private static final long serialVersionUID = 1L;`。 2. **自定义生成**:基于类名、接口名、成员方法及属性等信息生成一个 64 位的哈希值,例如 `private static final long ...

    北大青鸟超市管理系统

    private static final long serialVersionUID = -6316960884845775373L; public UserAdd() { super(); } public void destroy() { super.destroy(); // Just puts "destroy" string in log // Put your ...

    EasyUI框架 使用Ajax提交注册信息的实现代码

    一、服务器代码: ... private static final long serialVersionUID = -2612140283476148779L; private Logger logger = Logger.getLogger(StudentAction.class); private String rows;// 每页显示的记录数 pri

    家庭理财系统(java+applet).zip

    private static final long serialVersionUID = 1L; public static JButton bt3 = new JButton("修改"); public static JButton bt4 = new JButton("取消"); public static JLabel lb2 = new JLabel("收入 元"); ...

    webServer web服务器

    private static final long serialVersionUID = -5191965365261772248L; private JPanel jp; private JLabel[] jl = { new JLabel("请输入您要查询记录的时间"), new JLabel("开始时间:"), new JLabel(...

    Traffic_Light交通模拟

    private static final long serialVersionUID = -5191965365261772248L; private JPanel jp; private JLabel[] jl = { new JLabel("请输入您要查询记录的时间"), new JLabel("开始时间:"), new JLabel(...

    JavaWeb教材配套资源

    private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, ...

    coreJava: serialVersionUID

    这里,`1L`是`serialVersionUID`的值,如果类的结构未改变,可以继续使用这个值。如果添加、删除或修改了类的成员,应当重新计算`serialVersionUID`,以避免出现反序列化异常。 计算`serialVersionUID`的方法有多种...

    Java 最优二叉树的哈夫曼算法的简单实现

    private static final long serialVersionUID = 1L; public TreeException() {} public TreeException(String message) { super(message); } } Java 最优二叉树的哈夫曼算法的简单实现演示了哈夫曼树的构建和...

    25个经典Spark算子的JAVA实现

    private static final long serialVersionUID = 1L; @Override public String call(Integer number) throws Exception { return "number:" + number; // 将Integer类型转换为String } }); results.foreach...

    Android系列之Intent传递对象的几种实例方法

    private static final long serialVersionUID = -7060210544600464481L; private String name; // 其他属性和方法... } ``` 在Intent中传递Serializable对象: ```java Intent intent = new Intent(this, ...

    基于JAVA的拼图小游戏源码.zip

    private static final long serialVersionUID = 8290188097137862984L; public static final int IMAGEWIDTH = 200; // 图片宽度 private int place;// 图片位置 public Cell(ImageIcon icon, int place) { ...

    java序列化和serialVersionUID的使用方法实例

    private static final long serialVersionUID = -1466479389299512377L; private byte b = 12; public byte getB() { return b; } public void setB(byte b) { this.b = b; } public static void main...

Global site tag (gtag.js) - Google Analytics