序列化介绍和使用

序列化

  • 什么是序列化
    • 就是把java对象储存在某一地方(硬盘,网络),也就是将对象的内容流化
    • 两大类
      • 序列化
        • 将数据分解成字节流,一边存储在文件中或在网络上传输
      • 反序列化
        • 打开字节流并重构对象,对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据,
  • 常用的序列化

    • java中自带的序列化技术

      • IOException**
        • Serializable接口,则所有的序列化将会自动进行
      • Externalizable
        • 则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量
    • json
      • 定义
        • 是一种轻量级的数据交换格式,采用与编程语言无关的文本格式
      • 优缺点

        • 优点
          • 数据格式比较简单,易于读写
          • 序列化后数据较小,可扩展性好,兼容性好
        • 缺点
          • 数据的描述性不乐观
    • Fastjson
      • 定义
        • FastJson是一个java语言编写的高性能功能完善的JSON库
      • 优缺点

        • 优点
          • 接口简单易用
          • 目前java语言中最快的json库
        • 缺点
          • 过于注重快,而偏离了“标准”及功能性
          • 代码质量不高,文档不全
    • Protobuf
      • 定义
        • protobuf是可以进行跨语言的序列化机制
      • 优缺点

        • 优点
          • 性能强
          • 结构化数据存储格式(XML JSON等)
        • 缺点
          • 需要依赖于工具生成代码
  • 如何进行序列化

    • 让类实现Serializable接口

      • 该接口是一个标志性的接口,标注该类可被序列
    • 然后使用输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出

    • 如果需要反序列化,则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取对象

    • 代码

      • 序列化User到本地

        • @Test
          public void Test01() throws IOException {
              //获取文件的输出流inputStream
              //将这个对象输出
              User user1 = new User(1,"PopDemo","1234567");
              User user2 = new User(2,"yangfan","1234567");
              User user3 = new User(3,"iu","1234567");
              /**
               * 与这个文件的输出流进行绑定操作
               * 我们利用这个对象的输出流,然后进行写一个操作
               * 就可以实现对象的序列化的过程
               * 建立管道
               * 进行输出实体
               */
              ObjectOutputStream oos = new ObjectOutputStream(new     FileOutputStream("F:/pop.txt"));
              //讲类输出到管道内
              oos.writeObject(user1);
              oos.writeObject(user2);
              oos.writeObject(user3);
              oos.flush();
              oos.close();
              System.out.println("数据已保存到本地,感谢您的使用");
          }
          <!--0-->
  • transient 和 static 为什么不会被序列化的原因

    • transient static不会被序列化(IOException)

      • 序列化保存的是对象的状态,静态变量数以类的状态,因此序列化并不保存静态变量。

        这里的不能序列化的意思,是序列化信息中不包含这个静态成员域

      • 但是还有一种情况会被序列化

        • One
          • 当我们实现Externalizable接口,则没有任何东西可以自动序列化,需要在writeExternal方法中进行手工指定所要序列化的变量,这与是否被transient修饰无关
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值