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值一致,那么就可以反序列化成功,反之失败。

     

    身体是革命的本钱,爱跑步,爱生活!
  • 相关阅读:
    VS 2015 GIT操作使用说明
    态度以及业余付出决定程序生涯
    Magicodes.WeiChat——使用OAuth 2.0获取微信用户信息
    Magicodes.WeiChat——ASP.NET Scaffolding生成增删改查、分页、搜索、删除确认、批量操作、批量删除等业务代码
    Magicodes.WeiChat——利用纷纭打造云日志频道
    Magicodes.WeiChat——自定义knockoutjs template、component实现微信自定义菜单
    产品管理之敏捷之路(一)——携手同行,走自己的敏捷之路
    Magicodes.NET框架之路——V0.0.0.5 Beta版发布
    Spring mvc中@RequestMapping 6个基本用法小结
    spring.net aop 讲解
  • 原文地址:https://www.cnblogs.com/caozx/p/8336868.html
Copyright © 2011-2022 走看看