昆明网站建设电话,重庆专业的网站服务公司,学校网站建设交流汇报,爱站网站程序在运行过程中#xff0c;可能需要将一些数据永久地保存到磁盘上#xff0c;而数据在Java中都是保存在对象当中的。那么我们要怎样将对象中的数据保存到磁盘上呢?这时就需要使用Java中的对象序列化。对象的序列化(Serializable)是指将一个Java对象转换成一个I/O流中字节序…程序在运行过程中可能需要将一些数据永久地保存到磁盘上而数据在Java中都是保存在对象当中的。那么我们要怎样将对象中的数据保存到磁盘上呢?这时就需要使用Java中的对象序列化。对象的序列化(Serializable)是指将一个Java对象转换成一个I/O流中字节序列的过程。其目的是为了将对象保存到磁盘中或允许在网络中直接传输对象。对象序列化机制可以使内存中的Java对象转换成与平台无关的二进制流既可以将这种二进制流持久地保存在磁盘上又可以通过网络将这种二进制流传输到另一个网络节点其他程序在获得了这种二进制流后还可以将它恢复成原来的Java对象。这种将I/O流中的字节序列恢复为Java对象的过程被称之为反序列化(Deserialize)。如果想让某个对象支持序列化机制那么这个对象所在的类必须是可序列化的。在Java中可序列化的类必须实现Serializable 或Externalizable两个接口之一。这两个接口实现序列化机制的主要区别如表7-7所示。与实现Serializable 接口相比虽然实现Externalizable 接口可以带来一定性能上的提升但也将导致编程的复杂度增加。在实际开发时大部分都是采用实现Serializable 接口的方式来实现序列化的。表7-7 实现 Serializable 与实现Externalizable 的对比实现 Serializable 接口实现Externalizable 接口系统自动存储必要的信息由程序员决定所储存的信息Java内部支持易于实现只需实现该接口即可不需要其他代码支持接口中只提供了两个空方法实现该接口必须为两个空方法提供实现性能较差性能较好 使用Serializable 接口实现序列化非常简单只需要让目标类实现Serializable 接口即可无须实现任何方法。例如让Person类实现序列化接口的代码如下publicclassPersonimplementsSerializable{//为该类指定一个serialVersionUID变量值privatestaticfinallong serialVersionUID 1L://声明变量privateint id;privateString name;privateint age;//此处省略各属性的getter和setter方法⋮
}在上述代码中Person类实现了Serializable接口并指定了一个serialVersionUID变量值该变量值的作用是标识Java类的序列化版本。如果不显式地定义serialVersionUID变量值那么将由JVM根据类的相关信息计算出一个serialVersionUID变量值。小提示serialVersionUID适用于Java的序列化机制。简单来说Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。在进行反序列化时JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较如果相同就认为是一致的可以进行反序列化否则就会出现序列化版本不一致的异常。因此为了在反序列化时确保序列化版本的兼容性最好在每一个要序列化的类中加入privatestatic final long serialVersionUID的变量值具体数值可自定义(默认是1L系统还可以根据类名、接口名、成员方法及属性等生成的一个64位的哈希字段)。这样某个对象被序列化之后即使它所对应的类被修改了该对象依然可以被正确地反序列化。