序列化与反序列化

序列化是指java对象转换为字节序列的过程,反序列化是从文件中取出经过序列化的对象。

Serializable接口,用于标记此类可序列化,该类的所有属性都需要实现了该接口。

//序列化与反序列化
    /*序列化,序列化类的属性都要实现序列化
    A a = new A("name","金苹果");
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D://a.txt"));
    //NotSerializableException不可序列化异常,需要序列化对象类要实现serializable
    out.writeObject(a);
    out.close();*/
    //反序列化
    ObjectInputStream input = new ObjectInputStream(new FileInputStream("D://a.txt"));
    //获得反序列化对象
    A a =(A) input.readObject();
    System.out.println(a.name);
    System.out.println(a.info);
    input.close();
}
 static class A implements Serializable {
    String name;
    String info;
     public A() {
     }
     public A(String name, String info) {
         this.name = name;
         this.info = info;
     }

实现部分序列化方式

  1. 使用transient修饰符修饰的属性不参与序列化。
  2. 使用static修饰的属性不参与序列化。
  3. Serializable接口中复制俩个私有方法:writerObject和readerObject方法进行选择需要序列化的属性。
  4. Externalizable接口,重写俩个方法。

区别

Serializable

Externalizable

实现复杂度

实现简单,java对其内建支持(可以不创建方法执行序列化)

实现复杂,又开发人员自己完成

执行效率

所有对象由java统一保存,性能较低

开发人员决定哪个对象保存,可能造成速度提升

保存信息

保存时占用空间大

部分存储,可能造成空间减少

使用频率

偏低

 Serializable

既可以写下这俩个方法也可以不写下,底层会调用默认方法。

private String name;
private String age;

private void writeObject(java.io.ObjectOutputStream out) throws IOException {
    System.out.println("序列化");
    out.writeObject(name);
    out.writeObject(age);
    out.close();
}

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
    System.out.println("反序列化----");
    name = (String) in.readObject();
    age = (String) in.readObject();
    in.close();
}

Externalizable

private String name;
private String age;

@Override
public void writeExternal(ObjectOutput out) throws IOException {
    System.out.println("序列化");
    out.writeObject(name);
    out.writeObject(age);
    out.close();
}

@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
    System.out.println("反序列化----");
    name = (String) in.readObject();
    age = (String) in.readObject();
    in.close();
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值