Java序列化

java序列化的应用场景:
1、当对象需要被网络传输时
2、当对象需要持久化时

一段序列化的工具类SerializeTool

public class SerializeTool {
    public static void serialize(Object obj, String fileName) throws Exception{
        File file = new File(fileName);
        FileOutputStream output = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(output);

        oos.writeObject(obj);
        oos.flush();
        oos.close();
        output.close(); 
    }
        //反序列化
    public static Object deSerialize(String fileName) throws Exception{
        File file = new File(fileName);
        FileInputStream input = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(input);

        Object object = ois.readObject();
        ois.close();
        input.close();
        return object;
    }
        //显示文件信息,包括文件名,文件大小等,注意,这段代码可能有问题,但可以
        //找到那份文件,右击选择属性查看文件大小
    public static void printFileInfo(String fileName){
        File file = new File(fileName);
        System.out.println("---------------");
        System.out.println("<FileName>:"+fileName);
        System.out.println("<FileSize>:"+fileName.length()+"bytes");
        System.out.println("---------------");
    }
}

对象序列化,序列化的是什么东西
1、对象序列化,只对类的普通成员序列化
2、对象序列化,不序列化静态成员、瞬态成员和方法(为了保护敏感数据,即遇到不对对象的某些字段序列化,可以使用transient关键字)
比如:transient private String password;

继承关系的序列化
子类继承父类,父类实现Serializable接口,当子类也实现Serializable,进行对象序列化,继承父类的属性也会被序列化到文件中
子类继承父类,父类不实现Serializable接口,当子类也实现Serializable,进行对象序列化,继承父类的属性不会被序列化到文件中
可以查看文件大小去证明,也可以显示某个继承的字段的值去证明

引用关系的序列化
同理,被引用的关系,也同样需要实现Serializable接口。如果类的一个参数类型是引用类型,那么这个引用类型的类必须是可序列化的,否则,该类将不可序列化。

在序列化类中,一般会有一个属性叫serialVersionUID(如:private static final long serialVersionUID = 1L;),在序列化与发序列化的过程中,serialVersionUID起着非常重要的作用,每个类都有一个特定的serialVersonUID,在反序列化的过程中,通过serialVersionUID来判定类的兼容性。如果待序列化的对象与目标对象的serialVersionUID不同,那么在反序列化时就会抛出InvailidClassException异常。
自定义serialVersionUID的3个优点:
(1)提高程序的运行效率。如果未自定义,那么在序列化时会通过计算得到一个serialVersionUID值。通过显示声明的方式省去了计算能的过程。
(2)提高程序不同平台上的兼容性。若没有显示声明serialVersionUID,不同的平台可能在计算serialVersionUID时得到的结果不同,这样的话就会出现在A平台序列化,在B平台反序列化时出现不兼容的情况
(3)增强程序各个版本的可兼容性。每个类都自定义一个UID,那么如果对这个类进行修改时,自定义的UID也要跟着修改,那么就会防止旧版本的类对象反序列化到新版本的类对象

注意:反序列化机制在恢复java对象的时候无需调用构造器来初始化java对象
下一篇,继续序列化

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值