一个码农

在大数据边缘试探 开始使用

关于 java 的 UID

在以前的编程中,一直使用 eclipse 作为 IED,经常在新建一个类的时候,eclipse 会警告提示需要一个 UID.从来都没有专门去研究这个玩意,只是他既然要,那我就给他一个好了,省的出现警告看着烦。慢慢随着 code 的量多了,渐渐知道这东西是干嘛的了,就是一个序列化 ID 嘛,但具体他是干嘛的,也都是到了今天才有一个完整的去了解。

一、序列化和反序列化

  • Serialization(序列化)是一种将对象以一连串的字节描述的过程;
  • 反序列化 deserialization 是一种将这些字节重建成一个对象的过程

二、序列化 ID(serializable Id)

  • 序列化 ID 在 Eclipse 下提供了两种生成策略,一个是固定的 1L,一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具生成),在这里有一个建议,如果没有特殊需求,就是用默认的 1L 就可以,这样可以确保代码一致时反序列化成功。这也可能是造成序列化和反序列化失败的原因,因为不同的序列化 id 之间不能进行序列化和反序列化。

三、为什么需要显式的声明 UID

该部分内容参考《改善 Java 程序的 151 个建议》(秦小波著)

我们在编写一个实现了 Serializable 接口(序列化标志接口)的类,eclipse 马上会给一个黄色警告:需要增加一个 Serial Version ID。为什么要增加?它是怎么计算出来的?有什么用呢?

类实现 Serializable 接口的目的是为了可持久化,比如网络传输或本地存储,为系统的分布和异构部署提供先决支持条件。若没有序列化,现在我们熟悉的远程调用、对象数据库都不可能存在,我们来看一个简单的序列化类:

public class Person implements Serializable{
  private String name;
  
  public String getName(){
    return this.name;
  }
  
  public void setName(String name){
    this.name = name;
  }
}

这是一个简单的 JavaBean,实现了 Serializable 接口,可以在网络上传输,也可以本地存储然后读取。这里我们以 Java 消息服务(Java Message Service) 方式传递该对象(即通过网络传输一个对象),定义在消息队列中的数据类型为 ObjectMessage,首先定义一个生产者(Producer),代码如下:

public class Producer{
  public static void main(String[] args) throws Exception{
    Person person = new Person();
    person.setName("李白");
    //序列化,保存到磁盘上
    SerializationUtils.writeObject(person);
  }
}
一个可菜可菜的码农

评论
留下你的脚步