简单回顾Java中的IO流与序列化

  1. 输入输出流的划分是相对于程序而言的,并不是相对数据源,流入程序的的数据叫输入流,程序将数据经过加工处理之后输出至目的源的数据流叫做输出流
  2. InputStream/OutputStream和Reader/Writer类是所有IO流类的抽象父类
  3. 分类:
    1.按流的方向分类,分为输入流(以InputStream、Reader结尾的流)、输出流(以OutPutStream、Writer结尾的流)。
    2. 按处理的数据类型分类,分为字符流(read或者writer结尾)、字节流(stream结尾)。
    3. 按处理对象不同分类:节点流:可以直接从数据源或目的地读写数据,如FileInputStream、FileReader、DataInputStream、处理流:不直接连接到数据源或目的地,是”处理流的流”。通过对其他流的处理提高程序的性能,如BufferedInputStream、BufferedReader等。
  4. 处理流也叫包装流。节点流处于IO操作的第一线,所有操作必须通过它们进行;处理流可以对节点流进行包装,提高性能或提高程序的灵活性。
  5. 数据流将“基本数据类型与字符串类型”作为数据源,从而允许程序以与机器无关的方式从底层输入输出流中操作Java基本数据类型与字符串类型。
  6. Java对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为Java对象的过程称为对象的反序列化。
  7. 对象序列化的作用有如下两种
    持久化:把对象的字节序列成字节数组永久地保存到硬盘上,通常存放在一个文件中。
    网络通信:在网络上传送对象的字节序列。比如:服务器之间的数据通信、对象传递。
  8. 只有实现了Serializable接口的类的对象才能被序列化。Serializable接口是一个空接口,只起到标记作用。
    通过ObjectOutputStream、ObjectInputStream、ByteArrayInputStream、ByteArrayOutputStream序列化对象。(字节数组)
    序列化
    public <T> byte[] serialize(T obj) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            ObjectOutputStream oos=new ObjectOutputStream(baos);
            oos.writeObject(obj);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("序列化失败");
        }
        byte[] bytes = baos.toByteArray();
        return bytes;
    }

反序列化

 public <T> T deSerialize(byte[] buffer, Class<T> clazz) {
        ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
        try {
            ObjectInputStream ois = new ObjectInputStream(bais);
            return (T) ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("反序列化失败");
        }
    }

9.Java的序列化机制是通过判断类的 serialVersionUID 来验证版本一致性的。在进行反序列化时,JVM 会把传来的字节流中的 serialVersionUID与本地相应实体类的 serialVersionUID 进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是 InvalidCastException如果没有为指定的 class 配置 erialVersionUID,那么 java 编译器会自动给这个 class 进行一个摘要算法,类似于指纹算法,只要这个文件有任何改动,得到的 UID 就会截然不同的,可以保证在这么多类中,这个编号是唯一的
10. 序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量。
11. 浅克隆:实现clone接口,在拷贝的时候,并没有创建一个新的对象,拷贝的是内存地址值,对于引用类型和对象,还是同一个对象
12. 深度克隆:将对象序列化(在内存中操作)之后,再序列化加载到JVM中,JVM会重新开辟一个新的空间。这样拷贝的引用类型的内存地址变化,就不是同一个对象了,

    public User deepClone(){
        ISerialize serialize=new JdkSerialize();
        byte[] bytes = serialize.serialize(this);
        return serialize.deSerialize(bytes,User.class);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值