美文网首页
Java☞序列化和反序列化

Java☞序列化和反序列化

作者: 小明今晚加班 | 来源:发表于2019-05-29 22:23 被阅读0次

    什么是序列化/反序列化?

    序列化:将对象转换为字节序列的过程称为对象的序列化
    反序列化:将字节序列恢复为对象的过程称为对象的反序列化

    序列化能干什么?

    1. 存储,比如把对象序列化为字节序列永久保存到磁盘上
    2. 传输,网络上传输对象的字节序列

    序列化/反序列化API

    java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可将obj对象进行序列化,把得到的字节序列写到一个目标输出流中;
    java.io.ObjectInputStream代表对象输入流,它的readObject(Object obj)方法可从源输入流中读取字节序列,再把字节序列反序列化为对象,并返回;
    序列化步骤
    1)、创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流、字节数组输出流等
    2)、通过对象输出流的writeObject(Object obj)方法把对象写到一个目标输出流中

    反序列化步骤
    1)、创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流、字节数组输入流等
    2)、通过对象输入流的readObject(Object obj)方法读取对象

    举个例子说明一下序列化/反序列化的应用场景

    package cn.ihep.clone;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    public class User implements Serializable {
        private static final long serialVersionUID = 1L;
    
        private String name;
        private int age;
    
        public User(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        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 "User [name=" + name + ", age=" + age + "]";
        }
    
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            User u1 = new User("xiaoming", 18);
            // User u2 = new User("ahua", 45);
            // User u3 = new User("zhangsan", 19);
            // User u4 = new User("lisi", 20);
            // List<User> list = new ArrayList<>();
            // list.add(u1);
            // list.add(u2);
            // list.add(u3);
            // list.add(u4);
    
            // 序列化
            ByteArrayOutputStream bo = new ByteArrayOutputStream();
            ObjectOutputStream oo = new ObjectOutputStream(bo);
            oo.writeObject(u1);
    
            // 反序列化
            ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
            ObjectInputStream oi = new ObjectInputStream(bi);
            User u = (User) oi.readObject();
            System.out.println(u);
        }
    }
    ------------------------
    输出结果:
    User [name=xiaoming, age=18]
    

    相关文章

      网友评论

          本文标题:Java☞序列化和反序列化

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