首页 > 其他分享 >序列话ID的作用

序列话ID的作用

时间:2023-04-13 17:02:25浏览次数:29  
标签:name public person 作用 序列 序列化 ID serialVersionUID

1、序列化ID的作用
其实,这个序列化ID起着关键的作用,它决定着是否能够成功反序列化!简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地实体类中的serialVersionUID进行比较,如果相同则认为是一致的,便可以进行反序列化,否则就会报序列化版本不一致的异常。等会我们可以通过代码验证一下。

2、序列化ID如何产生
当我们一个实体类中没有显示的定义一个名为“serialVersionUID”、类型为long的变量时,Java序列化机制会根据编译时的class自动生成一个serialVersionUID作为序列化版本比较,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID。譬如,当我们编写一个类时,随着时间的推移,我们因为需求改动,需要在本地类中添加其他的字段,这个时候再反序列化时便会出现serialVersionUID不一致,导致反序列化失败。那么如何解决呢?便是在本地类中添加一个“serialVersionUID”变量,值保持不变,便可以进行序列化和反序列化。

3、验证“serialVersionUID”不一致导致反序列化失败

public class Person implements Serializable {
    //序列化ID
    //private static final long serialVersionUID = -5809782578272943999L;
 
    private int id;
    private String name;
    //private int age;
 
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
//    public int getAge() {
//        return age;
//    }
//
//    public void setAge(int age) {
//        this.age = age;
//    }
//    @Override
//    public String toString() {
//        return "Person{" +
//                "id=" + id +
//                ", name='" + name + '\'' +
//                ", age=" + age +
//                '}';
//    }
}

复制上文的序列化与反序列化代码

    @Test
    /**
     * 对象序列化
     */
    public void test5(){
        Person person = new Person();
        person.setId(1);
//      person.setAge(12);
        person.setName("小明");
 
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("d:/io/data.txt"));
            oos.writeObject(person);
            System.out.println("序列化成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(oos != null) {
                    oos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

运行一下,会在控制台中打印“序列化成功。”,然后我们在Person类中再添加一个字段,name,然后直接从data.txt中反序列化,再运行一下,看看会出现什么问题。

    @Test
    /**
     * 对象反序列化
     */
    public void test6(){
        Person person = null;
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream("d:/io/data.txt"));
            person = (Person) ois.readObject();
            System.out.println(person);
            System.out.println("反序列化成功");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                if(ois != null){
                    ois.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

运行一下,不出意外,报了一个异常。

 

 

总结:

       虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化 ID 是否一致(就是 private static final long serialVersionUID = 1L)。

 

原文链接:https://blog.csdn.net/qq_51409098/article/details/126412452

标签:name,public,person,作用,序列,序列化,ID,serialVersionUID
From: https://www.cnblogs.com/yzx-sir/p/17315426.html

相关文章

  • adb命令获取android app FPS 执行命令后只出现一行16666666的解决方案
    一、问题描述使用命令command='adbshelldumpsysSurfaceFlinger--latency{}/{}#0'.format(package_name,activity)获取androidapp的fps数据,执行命令后街股票打印如下:  二、问题分析1、刚开始以为是命令里面的SurfaceView写的有问题,执行命令adbshelldumpsys......
  • java.io.Serializable(序列化)接口
     一、概念Java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象。对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一种序列化的形式用于存储和传输。反序列化就是根据这些保存的信息重建对象的过程。序......
  • cookie的相关作用
    cookie除了使用js文件来将相关的用户名密码存储到cookie里面,并执行保留7天的操作之外,我们同样可以是使用servlet进行相关问题的解决若是用户名以及密码的登录条件符合要求,则可以使用cookie对其进行存储:知乎实现登录成功之后的跳转:如果已经登录过如果已经登录过,那么可以定义......
  • es 同步索引报错:ElasticSearch ClusterBlockException[blocked by: [FORBIDDEN/12/ind
    es同步索引报错:ElasticSearchClusterBlockException[blockedby:[FORBIDDEN/12/indexread-only/allowdelete(api)]原因:网上有的解决方式是方法一,我试过,没有生效使用的是方法二方法一curl-XPUT-H"Content-Type:application/json"https://localhost:9200/_all/_set......
  • Android性能优化之APK瘦身
    结构分析首先上传一张瘦身前通过Analyzeapp分析出来的图片(打开方式:AndroidStudio下——>Build——>Analyzeapp):imageAPK包结构如下:lib/:包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a,arm64-v8a,x86,x86_64,和mips。大多数情况......
  • C# Json序列化,设置驼峰命名(字段首字母小写)
    相关代码:varserializerSettings=newJsonSerializerSettings{//设置为驼峰命名ContractResolver=newCamelCasePropertyNamesContractResolver()};varresult=JsonConvert.Ser......
  • k8s各组件作用和pod通信原理
    https://www.cnblogs.com/cyh00001/p/16488539.htmlkube-apiserverkube-apiserver负责和etcd交互,提供了k8s各类资源对象的增删改查及watch等HTTPRest接口,这些对象包括pods、services、replicationcontrollers等,APIServer为REST操作提供服务,并为集群的共享状态提供前端......
  • 在idea运行maven项目 将mybatis的接口与接口对应xml文件放在同一个包下,启动时无法找到
    在项目的在pom文件中引入如下<resources><resource><directory>src/main/java</directory><excludes><exclude>**/*.java</exclude></excludes></resource>......
  • 餐饮小程序系统开发有哪些作用?五个作用非常突出
     众所周知,餐饮行业的商家非常适合开发一个餐饮小程序系统,可以给商家带来很大的帮助。那么餐饮小程序系统开发有哪些作用?今天名锐讯动为大家介绍五个作用非常突出。 1.定位服务。如果用户想要到店就餐却不知道商家门店的具体位置该怎么办呢?一旦没有解决这个问题,那么商家门店在......
  • Android开发startActivityForResult()弃用,推荐使用registerForActivityResult()方法
    SecondActivity中publicclassSecondActivityextendsAppCompatActivity{privatestaticfinalStringTAG="SecondActivity";@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);......