zoukankan      html  css  js  c++  java
  • java序列化

    序列化:将对象写入到IO流中
    反序列化:从IO流中恢复对象
    意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。
    使用场景:所有可在网络上传输的对象都必须是可序列化的,比如RMI(remote method invoke,即远程方法调用),传入的参数或返回的对象都是可序列化的,否则会出错;所有需要保存到磁盘的java对象都必须是可序列化的。通常建议:程序创建的每个JavaBean类都实现Serializeable接口。


    java本身的序列化机制存在的问题
    1. 序列化数据结果比较大、传输效率比较低
    2. 不能跨语言对接

    恰当的序列化协议不仅可以提高系统的通用性、强壮型、安全性、优化性能。同时还能让系统更加易于调试和扩展

    实现一个序列化操作
    1. 实现Serializable接口
    2. ObjectInputStream : 表示读取指定的字节数据转换成对象
    3. ObjectOutputStream :


    serialVersionUID

    java序列化提供了一个private static final long serialVersionUID 的序列化版本号,只有版本号相同,即使更改了序列化属性,对象也可以正确被反序列化回来

    静态变量的序列化
    序列化并不保存静态变量的状态


    Transient关键字
    transient关键字表示指定属性不参与序列化


    父子类问题
    如果父类没有实现序列化,而子类实现列序列化。那么父类中的成员没办法做序列化操作
    序列化的存储规则
    对同一个对象进行多次写入,打印出的第一次存储结果和第二次存储结果,只多了5个字节的引用关系。
    并不会导致文件累加

    序列化实现深度克隆
    浅拷贝(浅复制、浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。
      换言之,浅拷贝仅仅复制所拷贝的对象,而不复制它所引用的对象。
    深拷贝(深复制、深克隆):被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。
      那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。
      换言之,深拷贝把要复制的对象所引用的对象都复制了一遍

    总结
    1. 在java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化
    2. 通过ObjectOutputStream和ObjectInputStream对对象进行序列化合反序列化操作
    3. 对象是否允许被反序列化,不仅仅是取决于对象的代码是否一致,同时还有一个重要的因素(UID)
    4. 序列化不保存静态变量
    5. 要想父类对象也参与序列化操作,那么必须要让父类也实现Serializable接口
    6. Transient关键字,主要是控制变量是否能够被序列化。如果没有被序列化的成员变量反序列化后,会被设置成初始值,比如String -> null
    7. 通过序列化操作实现深度克隆

    主流的序列化技术
    xml/JSON/Hessian(2) /xml/protobuf/kryo/MsgPack/FST/thrift/protostuff/Avro

  • 相关阅读:
    Kubernetes Declarative Deployment
    Kubernetes集群如何查看scheduler/controller manager谁是leader
    kubelet 配置管理 (一)
    Kubernetes Ingress
    如何计算Kubernetes容器CPU使用率
    Kubernetes概念
    .NET陷阱之四:事件监听带来的问题与弱监听器
    .NET陷阱之三:“正确”使用控件也会造成内存泄露
    .NET陷阱之五:奇怪的OutOfMemoryException——大对象堆引起的问题与对策
    自己编译得到 arm64v8a 版本的libZBarDecoder.SO文件
  • 原文地址:https://www.cnblogs.com/snow1314/p/12499516.html
Copyright © 2011-2022 走看看