Java Serializable

一、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

posted @ 2019-05-14 10:19  江湖小小白  阅读(576)  评论(0编辑  收藏  举报