zoukankan      html  css  js  c++  java
  • Java | 原来 serialVersionUID 的用处在这里

    一直不太明白Java对象里 serialVersionUID 字段是做什么用的。
    有或者没有,它们之间有差别吗?除了Eclipse里提示的那个黄色的警告。

    今天终于知道,原来是在对象序列化这块有作用。

    看个例子。

    有这样一个对象 User:

    class User implements Serializable {
    
        String username;
        int age;
        String gender;
        Date regDay;
        boolean martialStatus;
    
        @Override
        public String toString() {
            return "User [username=" + username + ", age=" + age + ", gender=" + gender + ", regDay=" + regDay
                    + ", martialStatus=" + martialStatus + "]";
        }
    
    }

    现在将这个对象序列化存储到硬盘上:

    public void testWriteObject() {
        User user = new User();
        
        user.username = "Jack";
        user.password = "1234567";
        user.age = 20;
        user.gender = "male";
        user.regDay = new Date();
        user.martialStatus = false;
        
        // 文件的后缀名不影响,无论是 txt,io,甚至是没有后缀
        ObjectSerialize.writeObject(user, "d:\tmp\obj");
    }

    注: ObjectSerialize 是笔者自己封装的简单的对对象序列化存取的工具类。

    下同。

    从对应的文件中读取对象信息:

     public void testReadObject() {
         User user = (User) ObjectSerialize.readObject("d:\tmp\obj");
         System.out.println(user);
     }

    目前为止都是正常的。能够存储对象,也能够正确地读取对象信息。

    假如,User对象又新增了一个国籍(nationality)字段,新的User类如下(主要差别是在第 8 行的新增字段):

    class User implements Serializable {
    
        String username;
        int age;
        String gender;
        Date regDay;
        boolean martialStatus;
        String nationality; // 新增的字段
    
        @Override
        public String toString() {
            return "User [username=" + username + ", age=" + age + ", gender=" + gender + ", regDay=" + regDay
                    + ", martialStatus=" + martialStatus + ", nationality=" + nationality + "]";
        }

    这个时候再去读区原来的对象文件,你会得到一个异常信息:

    java.io.InvalidClassException: org.young.elearn.io.User; local class incompatible: stream classdesc serialVersionUID = 7967476135812239100, local class serialVersionUID = 905986497687499238

     serialVersionUID  的问题!!!
    文件里存储的User对象的 serialVersionUID 跟当前的User对象(User.class)的 serialVersionUID 不一致。因为如果一个Java对象没有指定 serialVersionUID ,那么系统(JVM)动态地指定一个。

    为了解决这个问题,只要在定义User对象时指定 serialVersionUID 就可以了,即:

    class User implements Serializable {
    
        private static final long serialVersionUID = 7967476135812239100L;
    
        // same code as before
    
    }
  • 相关阅读:
    elementui 修改合计行样式
    C# 导出Excel NPOI 修改指定单元格的样式 或者行样式
    向基于语义模型的操作集成的演变
    在制造业的工业2.0中应用MOM系统
    制造运营管理 (MOM) 的工作流驱动方法
    语义模型在智能工业运营中的作用
    定义运营系统架构
    在离散混合制造环境中应用制造运营模型
    面试官:如果存取IP地址,用什么数据类型比较好 (C#版本)
    使用WtmPlus低代码平台提高生产力
  • 原文地址:https://www.cnblogs.com/icebutterfly/p/9111042.html
Copyright © 2011-2022 走看看