Java序列化

作者: 一亩水塘 | 来源:发表于2017-11-01 22:42 被阅读9次

    01.序列化

    Java 提供了一种对象序列化的机制。
    该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。
    将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。
    整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。

    02.实现

    • Employee
    public class Employee implements Serializable{
        private String name;
        private String address;
        private String telephone;
        private int age;
        private String Email;
    }
    
    • serializeObject
    private static void serializeObject(Object object) {
            if (object == null) {
                throw new IllegalArgumentException("object can't be null");
            }
            if (!(object instanceof Serializable)) {
                throw new IllegalArgumentException("object must be Serializable");
            }
            try {
                FileOutputStream fileOutputStream = new FileOutputStream("/Users/wangning/DeskTop/employee.ser");
                ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
                objectOutputStream.writeObject(object);
                objectOutputStream.close();
                fileOutputStream.close();
                System.out.println("序列化已完成");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    • deserializeObject
    private static void deserializeObject() {
            Employee employee = null;
            try {
                FileInputStream fileInputStream = new FileInputStream("/Users/wangning/DeskTop/employee.ser");
                ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
                employee = (Employee) objectInputStream.readObject();
                objectInputStream.close();
                fileInputStream.close();
            } catch (ClassNotFoundException | IOException e) {
                System.out.println("Employee class not found");
                e.printStackTrace();
            }
            if (employee != null) {
                System.out.println(employee.getName());
                System.out.println(employee.getAddress());
                System.out.println(employee.getTelephone());
            }
        }
    
    • Employee序列化结果


      code.png

    03.深入

    • a.关于serialVersionUID
    /**
     * 建议我们显示设置serialVersionUID。因为如果不声明,JVM会自动为我们产生一个值,单这个值和编译器的实现相关,并不稳定。
     * 这样就可能在不同JVM环境下出现反序列化时报InvalidClassException异常。
     */
        private static final long serialVersionUID = 5948291669509729179L;
    

    相关文章

      网友评论

        本文标题:Java序列化

        本文链接:https://www.haomeiwen.com/subject/issnpxtx.html