序列化流/反序列化流

1. 序列化流

1.序列化流:ObjectOutputStream:将一个java对象的原始数据转换为流数据
	前提条件:Java对象所在的类必须实现序列化接口:java.io.Serializable(这个接口没有成员方法--->标记接口)

1.2 功能

1.构造方法:public ObjectOutputStream(OutputStream out) throws IOException:创建序列化流对象
  成员方法:public final void writeObject(Object obj) throws IOException:将指定的对象写入ObjectOutputStream流中

2. 反序列化流

1.反序列化流:ObjectInputStream:将网络中传输这种流数据还原成对象

2.2 功能

1.构造方法:public ObjectInputStream(InputStream in) throws IOException:创建反序列化流对象
  成员方法:public final Object readObject() throws IOException,ClassNotFoundException:将java对象的原始流数据还原成对象

3.可能出现的问题

1.问题一:java.io.NotSerializableException: com.qf.objectstream_03.Person:这个类未实现序列化接口
  解决方法
    Serializable接口,实现了这个接口,表示这个类可被ObjectOutputStream写入带流中
2.问题二:直接修改了Person类的内容,然后直接进行反序列化:报错
   java.io.InvalidClassException: com.qf.objectstream_03.Person;
local class incompatible: stream classdesc serialVersionUID =6724044596808576364,
  local class serialVersionUID = 1520880495741605311
      
   因为一旦进行序列化,类中包含的编码(类的签名信息:类中相关的成员)---会产生一个serialVersionUID,序列化版本ID
   当直接修改了某个类的成员,不能直接进行反序列化,因为内存中的serialVersionUID不一致!
   解决方法:添加一个固定的序列化版本Id:常量

4.代码实现

public class ObjectStreamDemo {
    public static void main(String[] args) throws Exception {

//      myWrite() ;
        myRead() ;

    }

    //反序列化 读
    private static void myRead()  throws Exception {
        //创建一个反序列化流对象
//         public ObjectInputStream(InputStream in) throws IOException
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt")) ;

        //将这个文件的存储的Java对象的原始数据 "流数据"---->还原成对象
        //public final Object readObject()throws IOException,ClassNotFoundException
        Object o = ois.readObject();
        System.out.println(o);
    }

    //序列化 写
    private static void myWrite() throws Exception {
        //创建一个序列化流对象
        // public ObjectOutputStream(OutputStream out) throws IOException: 创建序列化流对象
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt")) ;

        // public final void writeObject(Object obj) throws IOException
        //创建一个Person类对象
        Person p = new Person("高圆圆",42) ;
        oos.writeObject(p);

        //释放资源
        oos.close();
    }

}

public class Person implements Serializable {


    //setting--->Editor-->inspections--->搜索serialVersionUID,勾上
    //在类上--->alt+enter--->Add 添加一个固定的序列化版本Id值:常量
    private static final long serialVersionUID = 7408836797431347489L;
    String name ;

    private transient int age ;//如果想让某个类的成员不参与序列化,关键字transient

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值