java serializable 序列化

serializable(序列化)

– 将 对象转换为字节流** 保存起来**,并在以后还原这个对象,这种机制叫做对象序列化。

什么是序列化?实现序列化的目的是什么?

-- 比如一个对象我研究出来了,我把它放到内存里,内存关闭以后对象就会消失。为了不让这个

   对象消失,我们将这个对象实现序列化,以字节流的方式写入并保存在永久的存储设备上。等

           到下次虚拟机再开启时,我们将对象从磁盘里读回来,还原为对象,放入内存中并使用。

-- 将一个对象保存到永久存储设备上 成为持久化。
-- 一个对象要想能够实现序列化,必须实现Serializable接口或Externalizable接口。
(Externalizable与Serializable有继承关系,)

1. **一个类**** 若想被序列化 **,需要** 实现 **一个java.io.** Serializable**接口,该接口中没有定义任何方

   法,是一个标识性的接口(Marker Interface),当一个类实现了该接口,就表示这个类的

   对象是可以序列化的。

2.在序列化时,static 变量 是无法序列化的;如果A包含了对B的引用,那么在序列化A的时候也

   会将B一并的序列化;如果此时A可以序列化,B无法序列化,那么当序列化A的时候就会发生异常

  (NotSerializable),这时就需要将对B的引用设为 **transient** ,该关键字表示变量不会被序列化。

当我们在一个待序列化/反序列化的类中实现了以上两个private方法(方法声明要与上面的保持完全

一致),那么就允许我们以更加底层、更加细粒度的方式控制序列化/反序列化的过程。

当一个类实现了Serializable 接口时,表明该类可被序列化,这个时候Eclipse会要求你为该类定义一个字段,

该字段名字为 serial Version UID, 类型为long, 提示信息如下

你可以随便写一个,在Eclipse中它替你生成一个,有两种方式:

--1). 一个是默认的1L , 比如: private static final long serialVersionUID = 1L;

--2). 一个是很据类名、接口名、成员方法及属性等来生成一个64位的哈希字段, 比如:

      private static final long serialVersionUID = 8940196742313994740L; 之类的。

如果你没有考虑到兼容性问题时,就把它关掉,不过有这个功能是好的,只要任何类别实现了Serializable这个接口的话,如果没有加入serialVersionUID,eclipse都会给你warning提示,这个serialVersionUID为了让该类别Serializable 向后兼容

什么是** 向后兼容性?**

—- 如果你的对象序列化后存到硬盘上面后,可是后来你却更改了类的field(增加或减少或改名),

当你反序列化时,就会出现Exception,这样会造成不兼容性的问题

—- 但当serialVersionUID 相同时,它就会将不一样的field以type的缺省值Deserialize,

这个可以避开不兼容性的问题