【背景】
今天在写servlet文件时,遇到一个警告。大致了解到是序列化问题,但并不影响使用,因此并未细看解决。
先将知识点贴出来,之后再看。
【问题】
当一个类继承Serializable接口时,Eclipse经常会有黄色惊叹号提示。 提示内容如下:
The serializable class XXX does not declare a static final serialVersionUID field of type long
其实这个问题出现的具体原因是和序列化中的这个serialVersionUID有关。
当采用程序的Add default Serial version ID修复时,Eclipse会加上:
PRivate static final long serialVersionUID = 1L;
serialVersionUID 用来表明类的不同版本间的兼容性,默认1L。
当采用程序的Add generated Serial version ID修复时,Eclipse会加上:
private static final long serialVersionUID = xxxxL;
这是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段。
java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输、或 者持久化存储到数据库或文件系统中;然后在需要的时候,可以根据字节流中的信息来重构一个相同的对象。序列化机制在java中有着广泛的应用,EJB、 RMI等技术都是以此为基础的。
一般而言,要使得一个类可以序列化,只需简单实现java.io.Serializable接 口即可。该接口是一个标记式接口,它本身不包含任何内容,实现了该接口则表示这个类准备支持序列化的功能。
1、当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
2、当你想用套接字在网络上传送对象的时候;
3、当你想通过RMI传输对象的时候;
1、序列化时,只对对象的状态进行保存,而不管对象的方法;2、当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;3、当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;4、并非所有的对象都可以序列化
import java.io.*; public class Box implements Serializable { private int width; private int height; public void setWidth(int width){ this.width = width; } public void setHeight(int height){ this.height = height; } public static void main(String[] args){ Box myBox = new Box(); myBox.setWidth(50); myBox.setHeight(30); try{ FileOutputStream fs = new FileOutputStream("foo.ser"); ObjectOutputStream os = new ObjectOutputStream(fs); os.writeObject(myBox); os.close(); }catch(Exception ex){ ex.printStackTrace(); } } }
总结:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
新闻热点
疑难解答