• 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

  • 相关阅读:
    Docker大行其道—镜像
    Google 推出全新的两步验证机制
    安全警告——“Windows已经阻止此软件因为无法验证发行者”解决办法
    Word2010 自动生成二级编号
    正则表达式判断汉字
    c# IList<T> 深拷贝
    C#IList 取区间数据
    Oracle 同环比排除分母0
    Git 删除服务器的远程分支
    【转】C#获取当前路径7种方法
  • 原文地址:https://www.cnblogs.com/jhxxb/p/10523452.html
Copyright © 2020-2023  润新知