序列化和反序列化

1、什么是序列化和反序列化

Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程;

2、为啥需要序列化技术呢?

网络通信中可以传送二进制序列形式的图片、视频、文本。那么对象也能通过这种形式传送,运用的技术就是序列化。

3、序列化算法执行过程

Java的序列化算法

  • 序列化算法一般会按步骤做如下事情:
  • 将对象实例相关的类元数据输出。(元数据Annotation就是添加到程序元素如方法、字段、类和包上的额外信息,通俗来讲就是用于描述数据的数据)
  • 递归地输出类的超类描述直到不再有超类。
  • 类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。
  • 从上至下递归输出实例的数据
4、序列化的代码过程
4.1 序列化对象

只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。

serialVersionUID : 如果不设置,那么系统会根据类的信息来计算出一个UID,那么修改类的属性时,根据类计算出来的UID就会不一样。如果反序列化得到的对象,就造成了两个UID不一致,因此造成错误。

显式地定义serialVersionUID有两种用途:

  • 1、 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;
  • 2、 在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
class MyObject implements Serializable{
 
    private static final long serialVersionUID = 888L;
    
}
4.2 序列化
public void save(){
        try{
            MyObject myObject = MyObject.getInstance();
            FileOutputStream fosRef = new FileOutputStream(new File(
                    "myObject.txt"
            ));
            ObjectOutputStream oosRef = new ObjectOutputStream(fosRef);
            oosRef.writeObject(myObject);
            oosRef.close();
            fosRef.close();
        

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
4.3 反序列化
public void read(){
        try{
            FileInputStream fisRef = new FileInputStream(new File(
                    "myObject.txt"
            ));
            ObjectInputStream iosRef = new ObjectInputStream(fisRef);
            MyObject myObject  = (MyObject) iosRef.readObject();
            System.out.println("read: " + myObject.hashCode());

            iosRef.close();
            fisRef.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
5、相关注意事项
  • 序列化保存的是对象的状态,而静态变量是类的状态;
  • 当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值