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

  • 相关阅读:
    服务器带宽
    nload 源码安装
    Error: rpmdb open failed
    宽带,带宽,网速
    使用speedtest-cli测量服务器带宽
    ubuntu 安装 iperf
    微信退款机制
    记录程序执行之间,接口调用时间到日志文件或数据库
    机智的查询
    如果一些复杂的数据查询不好用数组,那就用字符串拼接,灵活方便
  • 原文地址:https://www.cnblogs.com/jhxxb/p/10523452.html
Copyright © 2011-2022 走看看