IO流-序列化与反序列化

在使用IO流保存信息的过程中,我们如果想要将数据的类型也保存下来应该如何操作?

例如我想保存的是将 int num = 100 ,这个100存入到文件中,并且要求能够读取时,能恢复其是int型的100。应该怎么做?使用寿命样的方法?我们由此引出了序列化与反序列化。

序列化就是在保存数据时,保存数据的值和数据类型。

反序列化就是在恢复数据时,恢复数据的值和数据类型。

需要让某个对象支持序列化机制,那么必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:       

Serializable            是一个标记接口,里面没有方法。使用比较方便。

Externalizable        该方法有接口需要实现,因此我们一般使用Serializable    

 我们可以使用对象流,提供序列化与反序列化的方法

ObjectOutputStream        提供序列化

ObjectInputStream           提供反序列化

演示demo实现序列化与反序列化。

package IO流.OBJStream;

import java.io.*;

/**
 * @program:多线程和IO
 * @descripton:
 * @author:ZhengCheng
 * @create:2021/10/6-15:24
 **/
public class ObjOutStream {
    public static void main(String[] args) throws IOException {
        String filepath = "d:\\data.dat";
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filepath));
        //序列化数据到file
        oos.writeInt(100);
        oos.writeBoolean(true);
        oos.writeChar('a');
        oos.writeDouble(1.1);
        oos.writeUTF("多线程与IO");
        //保存一个对象
        oos.writeObject(new Drink("a",10.0f));
        oos.close();
        System.out.println("数据保存完毕(已序列化)");
    }
}
//需要序列化只需要实现serializable接口
class Drink implements Serializable {
    private String name ;
    private float price ;

    public Drink(String name, float price) {
        this.name = name;
        this.price = price;
    }
}

 

public class ObjInStream {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        String filepath = "d:\\data.dat";
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filepath));

        System.out.println(ois.readInt());
        System.out.println(ois.readBoolean());
        System.out.println(ois.readChar());
        System.out.println(ois.readDouble());
        System.out.println(ois.readUTF());
        System.out.println(ois.readObject());

        ois.close();
        System.out.println("反序列化完毕");
    }
}

 注意事项:

        1.读写顺序要一致

        2.要求序列化或反序列化的对象,需要实现Serializable接口

        3.序列化的类中建议添加SerialVersionUID ,为了提高版本的兼容性

        4.序列化时,默认将里面所有属性都进行序列化,但除了static和transient修饰的成员

        5.序列化对象时,要求里面属性的类型也需要实现序列化接口

        6.序列化具备可继承性,也就是如果某类已经实现序列化,则它的所有子类已经默认实现了序列化。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值