全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java 序列化详解及简单实现实例

一、序列化

序列化定义:序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

目的:

  1. 以某种存储形式使自定义对象持久化
  2. 将对象从一个地方传递到另一个地方

二、Java序列化

一个对象能够序列化的前提是实现Serializable接口。Serializable接口没有方法,更像是个标记。有了这个标记的Class就能被序列化机制处理。如下:

class myPoint implements Serializable{ 
} 
 

JAVA反序列化不会调用任何构造器

序列化的控制:Externalizable。读写都交给你

  1. 要在方法writeExternal写入序列化的参数
  2. 要在方法readExternal读取反序列化的值
  3. 要有默认的构造方法(readExternal执行完成,再执行默认的构造器)
void writeExternal(ObjectOutput out) throws IOException; 
void readExternal(ObjectInput in) throws IOException,ClassNotFoundException; 
public class Point implements Externalizable { 
  private int a; 
  private int b; 
  public Point(int a, int b) { 
    this.a = a; 
    this.b = b; 
  } 
  public Point() { 
  } 
  public String toString() { 
    return a + " , " + b; 
  } 
   
  public void writeExternal(ObjectOutput out) throws IOException { 
    out.write(a); 
    out.write(b); 
  } 
  public void readExternal(ObjectInput in) throws IOException, 
      ClassNotFoundException { 
    a = in.read(); 
    b = in.read(); 
  } 
  public static void main(String[] args) throws IOException, 
      ClassNotFoundException { 
    String file = "d://1.txt"; 
    Point p = new Point(1, 2); 
    System.out.println(p); 
    FileOutputStream fos = new FileOutputStream(file); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(p); 
    FileInputStream fis = new FileInputStream(file); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    Point pp = (Point) ois.readObject(); 
    System.out.println(pp); 
  } 
} 
 
  1. transient关键字 关闭序列化自动进行。
  2. 不管你选择了哪种序列化形式,都要为自己编写的每个可序列化的类声明一个显示的序列版本UID(serial version UID)

三、序列化的问题

在effective Java中列举出了java序列化要注意的一些问题:

1.谨慎地设计实现Serializable接口

  1. 实现发布了就是一种承诺
  2. 如果一个类是为继承设计的,在‘允许子类实现Serializable接口'与‘禁止子类实现Serializable接口'取一个折中的方案是:提供一个可访问的无参构造器

2.保护性地编写 readObject()方法,因为readObject()是构建实例的入口。

不保护可能出现 构建了不满足要求的 实例

3.考虑自定义的序列化形式

  1. 逻辑内容 与 物理表示法
  2. 如果一个对象的 ‘物理表示法'等同于它的‘逻辑内容',可能就适用于使用默认的序列化形式。
  3. 如果有更好的 ‘物理表示法'在表示‘逻辑内容'则可以自定义序列化形式。
public class StringList implements Serializable { 
  private transient int size = 0; 
  private transient Entity head = null; 
  public final void add(String str) { 
    // ... 
  } 
  private static class Entity { 
    String data; 
    Entity next; 
    Entity previous; 
  } 
  private void writeObject(ObjectOutputStream s) throws IOException { 
    s.defaultWriteObject(); 
    s.write(size); 
    for (Entity e = head; e != null; e = e.next) { 
      s.writeObject(e.data); 
    } 
  } 
  private void readObject(ObjectInputStream s) throws IOException, 
      ClassNotFoundException { 
    s.defaultReadObject(); 
    int num = s.read(); 
    for (int i = 0; i < num; i++) { 
      this.add((String) s.readObject()); 
    } 
  } 
} 
 

四、序列化代理模式

    序列化机制提供的钩子函数有:

       writeReplace writeObject  readObject  readResolve

  1. writeReplace:序列化的时候替换所要序列化的对象。
  2. writeObject:写入序列化的对象
  3. readObject:读取序列化的对象
  4. readResolve:最后返回序列化对象
import java.io.InvalidObjectException; 
import java.io.ObjectInputStream; 
import java.io.Serializable; 
import java.util.Date; 
public final class Period implements Serializable { 
  private static final long serialVersionUID = 100L; 
  private final Date start; 
  private final Date end; 
  public Period(Date start, Date end) { 
    this.start = new Date(start.getTime()); 
    this.end = new Date(end.getTime()); 
    if (this.start.compareTo(this.end) > 0) { 
      throw new IllegalArgumentException(start + " after " + end); 
    } 
  } 
  public Date start() { 
    return new Date(start.getTime()); 
  } 
  public Date end() { 
    return new Date(end.getTime()); 
  } 
  public String toString() { 
    return start + " - " + end; 
  } 
  // 不给 
  private Object writeReplace() { 
    return new SerializationProxy(this); 
  } 
  private void readObject(ObjectInputStream stream) 
      throws InvalidObjectException { 
    throw new InvalidObjectException("proxy request"); 
  } 
  private static class SerializationProxy implements Serializable { 
    private final Date start; 
    private final Date end; 
    SerializationProxy(Period p) { 
      this.start = p.start; 
      this.end = p.end; 
    } 
    private Object readResolve() { 
      return new Period(start, end); 
    } 
    private static final long serialVersionUID = 1000L; 
  } 
}  

五、序列化算法

  1. 将对象实例相关的类元数据输出。
  2. 递归地输出类的超类描述直到不再有超类。
  3. 类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。
  4. 从上至下递归输出实例的数据

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Java序列化  # java  # 序列化实例  # 序列化详解  # java 中Spark中将对象序列化存储到hdfs  # 浅谈java中为什么实体类需要实现序列化  # 序列化版本号serialVersionUID的作用_动力节点Java学院整理  # 详解Java 对象序列化和反序列化  # Java 序列化和反序列化实例详解  # 浅谈Java序列化和hessian序列化的差异  # 序列化  # 递归  # 自定义  # 子类  # 要在  # 的是  # 是个  # 出了  # 就能  # 要有  # 适用于  # 这两个  # 要注意  # 希望能  # 不给  # 结合起来  # 谢谢大家  # 提供一个  # 则可  # 所要 


相关文章: 高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  建站之星安装后如何自定义网站颜色与字体?  简单实现Android验证码  表情包在线制作网站免费,表情包怎么弄?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  建站主机是什么?如何选择适合的建站主机?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  建站主机选虚拟主机还是云服务器更好?  建站主机SSH密钥生成步骤及常见问题解答?  建站主机服务器选型指南与性能优化方案解析  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  建站主机默认首页配置指南:核心功能与访问路径优化  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  如何用狗爹虚拟主机快速搭建网站?  免费视频制作网站,更新又快又好的免费电影网站?  linux top下的 minerd 木马清除方法  如何在腾讯云服务器快速搭建个人网站?  西安专业网站制作公司有哪些,陕西省建行官方网站?  广州建站公司哪家好?十大优质服务商推荐  公司网站制作需要多少钱,找人做公司网站需要多少钱?  家庭服务器如何搭建个人网站?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  大连 网站制作,大连天途有线官网?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  网站app免费制作软件,能免费看各大网站视频的手机app?  如何确保西部建站助手FTP传输的安全性?  IOS倒计时设置UIButton标题title的抖动问题  如何在景安服务器上快速搭建个人网站?  建站之星2.7模板:企业网站建设与h5定制设计专题  建站之星安装后界面空白如何解决?  长沙做网站要多少钱,长沙国安网络怎么样?  广州美橙建站如何快速搭建多端合一网站?  如何高效完成自助建站业务培训?  b2c电商网站制作流程,b2c水平综合的电商平台?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  如何快速搭建响应式可视化网站?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  网站制作价目表怎么做,珍爱网婚介费用多少?  音响网站制作视频教程,隆霸音响官方网站?  如何在万网自助建站中设置域名及备案?  建站之星在线版空间:自助建站+智能模板一键生成方案  已有域名和空间如何快速搭建网站?  网页设计网站制作软件,microsoft office哪个可以创建网页?  建站之星代理商如何保障技术支持与售后服务?  如何在云主机上快速搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。