zoukankan      html  css  js  c++  java
  • JAVA-序列化

    一、Serializable

    要序列化对象需要实现 Serializable 接口

    // lombok 插件,省去 get,set 方法,构造器方法
    @Data
    @AllArgsConstructor
    public class Person implements Serializable {
        private static final long serialVersionUID = -4091636180504737862L;
        private String name;
        private int age;
        private String sex;
    }

    序列化与反序列化方法

    public static void main(String[] args) throws Exception {
        Person person = new Person("zahngsan", 18, "man");
        Serialize(person, "D:/Person.txt");
    
        Person p = Deserialize(person, "D:/Person.txt");
        System.out.println(MessageFormat.format("name={0},age={1},sex={2}", p.getName(), p.getAge(), p.getSex()));
    }
    
    /**
     * 序列化
     */
    private static void Serialize(Object object, String path) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(path)));
        oos.writeObject(object);
        oos.close();
    }
    
    /**
     * 反序列
     */
    private static <T> T Deserialize(T t, String path) throws Exception, IOException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(path)));
        T object = (T) ois.readObject();
        ois.close();
        return object;
    }

    二、Externalizable

    与 Serializable 相比,Externalizable 更为灵活,可自己选择要序列化那些字段。

    Externalizable 继承自 Serializable。序列化对象实现 Externalizable 接口时,还需重写 writeExternal 和 readExternal 方法,并必须有空参构造器。

    // lombok 插件,省去 get,set 方法,构造器方法
    @Data
    @AllArgsConstructor
    @NoArgsConstructor // 空参构造器
    public class Person implements Externalizable {
        private static final long serialVersionUID = -4091636180504737862L;
        private String name;
        private int age;
        private String sex;
    
        @Override
        public void writeExternal(ObjectOutput out) throws IOException {
            out.writeObject(name);
            out.writeInt(age);
            out.writeObject(sex);
        }
    
        @Override
        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
            name = (String) in.readObject();
            age = in.readInt();
            sex = (String) in.readObject();
        }
    }

    序列化与反序列化与上面一样

    三、serialVersionUID

    阿里规范说明

    IDEA 自动生成 UID,Inspections -> serialVersionUID

    四、transient

    1、序列化之后保存的是类的信息(状态),被声明为 static 的属性不会被序列化,static 修饰的变量是属于类的而不是属于对象

    2、被声明为 transient 的属性不会被序列化,这就是 transient 关键字的作用

    3、transient 修饰,对实现 Externalizable 并指定序列化属性的无效。序列化时会先调用对象里的 writeObject 和 readObject 方法。

    若没有这样的方法,那么默认调用的是 ObjectOutputStream 的 defaultWriteObject 以及 ObjectInputStream 的 defaultReadObject 方法。


    http://www.importnew.com/17964.html

    https://www.cnblogs.com/szlbm/p/5504166.html

    https://www.cnblogs.com/wxgblogs/p/5849951.html

  • 相关阅读:
    Stream 常规操作
    Stream Introduction
    那些从阿里巴巴走出的创业牛人们
    码农转型传统行业更容易成功?
    创业者怎么讲故事打动投资人?
    李明远:移动互联网的创业时代
    想当年,那些抄我们试卷的坏分子,如今个个都当了老板.
    为什么说淘宝创业已难赚钱?
    让低版本IE支持Html5的新语义标签
    译文:TypeScript新手指南
  • 原文地址:https://www.cnblogs.com/jhxxb/p/10523452.html
Copyright © 2011-2022 走看看