java序列化

什么是序列化
序列化:把对象写入io流中
反序列化:从io流中恢复对象

为什么要序列化
为了方便传输
举例说明:我要给我的朋友邮寄一箱饼干,但是因为体积太大,就全压成粉末紧紧的一包寄过去。只不过java还有反序列化可以还原

如何实现序列化

  1. 实现Externalizable接口
public interface Externalizable extends java.io.Serializable {
    
    void writeExternal(ObjectOutput out) throws IOException;

    void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}
  1. 或者Serializable接口
public interface Serializable {
}

什么场景需要序列

  1. java中两个进程之间需要通信的时候
  2. 想把内存中的对象保存到硬盘中的时候

注意

  1. 当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
  2. 当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
  3. 并非对象的所有字段都可以序列化,例如transient修饰的字段、static修饰的变量,因为不在堆内存中,序列化只会序列化堆内存

serialVersionUID的作用
序列化对象版本控制

serialVersionUID的显示方式
一是默认的1L,比如:private static final long serialVersionUID = 1L;

二是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段

Serializable 实现序列化

@Data
@Builder
public class Person  implements Serializable {

    private static final long serialVersionUID = -5809782578272943999L;
    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private int age;
    /**
     * 性别
     */
    private String sex;
}
    /**
     * 序列化
     * @throws IOException
     */
    @Test
    public void serialize() throws IOException {
        Person p = Person.builder().age(18).name("wangshuang").sex("female").build();
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("d:/person.txt"));
        out.writeObject(p);
        out.close();

    }


运行完上面的方法,我的d盘出现在这里插入图片描述
内容如下
在这里插入图片描述
ObjectOutputStream代表对象输出流

    /**
     * 反序列化
     * @throws IOException
     * @throws ClassNotFoundException
     */
    @Test
    public void deserialize() throws IOException, ClassNotFoundException {

        ObjectInputStream in = new ObjectInputStream(new FileInputStream("d:/person.txt"));
        Person p = (Person)in.readObject();
        System.out.println(p);

    }

运行结果: Person(name=wangshuang, age=18, sex=female)
ObjectInputStream代表对象输入流

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值