把一个不可序列化的对象作为HttpSeesion属性来储存会破坏应用程序的可靠性。
示例:SharerInfo sharerInfo = new SharerInfo(); getServletRequest().getSession().setAttribute( “sharerInfo”,shareInfo);
其中SharerInfo类没有实现序列化(implements java.io.Serializable)
为了防止session状态,服务器必须序列化HttpSeesionState对象,需要对象可以被序列化存储。为了使会话能够正常运行,为对象声明Serializable 的属性,作为应用程序属性存储在会话中的数值必须实现 Serializable 接口。
序列化和反序列化
Serialization是一种将对象以一连串的字节描述的过程;deserialization是将这些字符重建成对象。
需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个类可以序列化。
如果我们想要序列化一个对象,首先要创建某些OutputStream(如FileOutputStream、ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中。这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节的,不能使用Reader和Writer等基于字符的层次结构)。而反序列的过程(即将一个序列还原成为一个对象),需要将一个InputStream(如FileInputstream、ByteArrayInputStream等)封装在ObjectInputStream内,然后调用readObject()即可。
https://blog.csdn.net/abc6368765/article/details/5136583
serialVersionUID的作用,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量。生成serialVersionUID,采用add generated serial version ID方式。类的serialVersionUID的默认值完全依赖于Java编译器的实现,对于同一个类,用不同的Java编译器编译,有可能会导致不同的 serialVersionUID,也有可能相同。为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明确的值。
显式地定义serialVersionUID有两种用途:
1、 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;
2、 在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
网友评论