Java-序列化(Serializable)

一、序列化和反序列化

序列化:将对象转化为字节流的形式保存在磁盘上或用于网络传输。
反序列化:将从磁盘上读取或从网络上接收到的字节流转化为序列化前的对象。

二、实现方式

给需要序列化的类实现Serializable接口.

public class User implements Serializable {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

三、案例

数据流:ObjectOutputStream & ObjectInputStream
只能作用在基本数据类型和引用数据类型上。

将序列化后的对象写入磁盘

@Test
    public void write() throws IOException {
        File file = new File("D:\\test.txt");
        FileOutputStream fos = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        User user = new User();
        user.setId(1L);
        user.setName("Ben");
        oos.writeObject(user);
    }

打开test.txt

 sr com.wsh.pojo.User)Ua( L idt Ljava/lang/Long;L namet Ljava/lang/String;xpsr java.lang.Long;嬩愄?? J valuexr java.lang.Number??  xp       t Ben

读取test.txt中的内容并进行反序列化

@Test
    public void read() throws IOException, ClassNotFoundException {
        File file = new File("D:\\test.txt");
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        System.out.println(ois.readObject());
        //输出结果:User{id=1, name='Ben'}
    }

四、serialVersionUID

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
  • 在进行反序列化前,会将字节流中的serialVersionUID和本地实体类中的serialVersionUID进行比较,相同则进行反序列化,不同则出现异常java.io.InvalidClassException。
  • serialVersionUID如不显示声明,则会根据类的结构生成一个隐式的值。

五、transient

若声明变量时有关键字transient,则该变量不会参与序列化,反序列化得到的结果为默认初始化的值。

六、静态变量不参与序列化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值