zoukankan      html  css  js  c++  java
  • Serializable-源码分析

    package java.io;
    public interface Serializable {
    }

    代码很简单,功能也很简单,对象通过这个接口来实现序列化和反序列的。下面来看看小例子。

    import java.io.Serializable;
    public class Person implements Serializable{
        private String name;
        private int age;
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "姓名:"+this.name +" ;年龄:" + this.age;
        }
    }

    这是最常见的bean,但是Eclipse有提示:The serializable class Person does not declare a static final serialVersionUID field of type long;意思就是让你添加一个静态的long类型的常量serialVersionUID。

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    public class Test{
        @org.junit.Test
        public void test(){
            Person person = new Person();
            person.setName("Tom");
            person.setAge(24);
            writeIntoFile(person);
            readFromFile();
        }
        //序列化
        public static void writeIntoFile(Serializable object){
            ObjectOutputStream out = null;
            try {
                out = new ObjectOutputStream(new FileOutputStream("111.txt"));
                out.writeObject(object);
                out.write(2);
                out.flush();
                System.out.println("序列化成功");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //反序列化
        public static void readFromFile(){
            ObjectInputStream in = null;
            try {
                in = new ObjectInputStream(new FileInputStream("111.txt"));
                Person person =(Person)in.readObject();
                System.out.println("反序列化成功");
                System.out.println(person.toString());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    结果是成功的:

    其实如果不添加serialVersionUID,那么Eclipse在会根据这个类的结构生成一个hash值,然后将这个值作为serialVersionUID。(大家可以做实验,在不添加serialVersionUID情况,反序列化换之前修改bean对象,看结果是否报错)

    试验步骤:

    1、序列化User对象的时候,先不要添加serialVersionUID。

    2、然后给Person对象添加serialVersionUID = 1000L,这个值随意。

    3、开始对新添加的Person对象,进行反序列化。

    结果报错 :java.io.InvalidClassException: object.testPackage.Person; local class incompatible: stream classdesc serialVersionUID = -5751053222744082002, local class serialVersionUID = 1000

    小结:序列化时,系统会把序列化的类的serialVersionUID写入到序列化文件中(猜的),当反序列化时,系统会去检测文件中的serialVersionUID,如果类中的serialVersionUID值和文件的serialVersionUID值一致,那么就可以反序列化成功,反之失败。

     

    身体是革命的本钱,爱跑步,爱生活!
  • 相关阅读:
    Python Scrapy 爬虫入门
    Python Requests 高级用法
    Python Requests库快速入门
    linux 高并发事件触发处理 — epoll
    初识Python爬妹子图片
    android 使用gradle实现资源自动拷贝
    Android Studio Cmake使用 (附带demo)
    JNI 学习笔记
    Cmake 常见命令说明
    mybatis逆向工程生成代码
  • 原文地址:https://www.cnblogs.com/caozx/p/8336868.html
Copyright © 2011-2022 走看看