什么是java序列化

Python011

什么是java序列化,第1张

Java中的序列化是把Java对象转换为字节序列的过程,能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输、或者持久化到存储数据库或文件系统中,然后在需要的时候通过字节流中的信息来重构一个相同的

一、什么是序列化:\x0d\x0a序列化理解成“打碎”是可以的,不过在书本上的名词就是将对象转换成二进制。\x0d\x0a\x0d\x0a二、在java中如何实现序列化:\x0d\x0a首先我们要把准备要序列化类,实现 Serializabel接口\x0d\x0a例如:我们要Person类里的name和age都序列化\x0d\x0aimport java.io.Serializable\x0d\x0a\x0d\x0apublic class Person implements Serializable { //本类可以序列化\x0d\x0a private String name \x0d\x0a private int age \x0d\x0a \x0d\x0a public Person(String name,int age){\x0d\x0a this.name = name \x0d\x0a this.age = age \x0d\x0a }\x0d\x0a public String toString(){\x0d\x0a return "姓名:" + this.name + ",年龄" + this.age \x0d\x0a }\x0d\x0a}\x0d\x0a\x0d\x0a然后:我们将name和age序列化(也就是把这2个对象转为二进制,统族理解为“打碎”)\x0d\x0apackage org.lxh.SerDemo\x0d\x0a\x0d\x0aimport java.io.File\x0d\x0aimport java.io.FileOutputStream\x0d\x0aimport java.io.ObjectOutputStream \x0d\x0a\x0d\x0apublic class ObjectOutputStreamDemo { //序列化\x0d\x0a\x0d\x0a public static void main(String[] args) throws Exception {\x0d\x0a//序列化后生成指定文件路径\x0d\x0a File file = new File("D:" + File.separator + "person.ser")ObjectOutputStream oos = null \x0d\x0a//装饰流(流)\x0d\x0a oos = new ObjectOutputStream(new FileOutputStream(file)) \x0d\x0a//实例化类\x0d\x0a Person per = new Person("张三",30) oos.writeObject(per) //把类对象序列化\x0d\x0a oos.close() \x0d\x0a }\x0d\x0a}

压缩和序列化主要用在数据的存储和传输上,二者都是由IO流相关知识实现,这里统一介绍下。

全部章节传送门:

Java I/O类支持读写压缩格式的数据流,你可以用他们对其他的I/O流进行封装,以提供压缩功能。

GZIP接口比较简单,适合对单个数据流进行压缩,在Linux系统中使用较多。

ZIP格式可以压缩多个文件,而且可以和压缩工具进行协作,是经常使用的压缩方法。

JAR(Java Archive,Java 归档文件)是与平台无关的文件格式,它允许将许多文件组合成一个压缩文件。为 J2EE 应用程序创建的 JAR 文件是 EAR 文件(企业 JAR 文件)。

JAR 文件格式以流行的 ZIP 文件格式为基础。与 ZIP 文件不同的是,JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用来指示工具如何处理特定的 JAR。

如果一个Web应用程序的目录和文件非常多,那么将这个Web应用程序部署到另一台机器上,就不是很方便了,我们可以将Web应用程序打包成Web 归档(WAR)文件,这个过程和把Java类文件打包成JAR文件的过程类似。利用WAR文件,可以把Servlet类文件和相关的资源集中在一起进行发布。在这个过程中,Web应用程序就不是按照目录层次结构来进行部署了,而是把WAR文件作为部署单元来使用。

一个WAR文件就是一个Web应用程序,建立WAR文件,就是把整个Web应用程序(不包括Web应用程序层次结构的根目录)压缩起来,指定一个.war扩展名。下面我们将第2章的Web应用程序打包成WAR文件,然后发布

要注意的是,虽然WAR文件和JAR文件的文件格式是一样的,并且都是使用jar命令来创建,但就其应用来说,WAR文件和JAR文件是有根本区别的。JAR文件的目的是把类和相关的资源封装到压缩的归档文件中,而对于WAR文件来说,一个WAR文件代表了一个Web应用程序,它可以包含 Servlet、HTML页面、Java类、图像文件,以及组成Web应用程序的其他资源,而不仅仅是类的归档文件。

在命令行输入jar即可查看jar命令的使用方法。

把对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为对象的过程称为对象的反序列化。

对象的序列化主要有两种用途:

java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

只有实现了Serializable的对象才能被序列化。对象序列化包括如下步骤:

对象反序列化的步骤如下:

创建一个可以可以序列化的对象。

然后进行序列化和反序列化测试。

s​e​r​i​a​l​V​e​r​s​i​o​n​U​I​D​:​ ​字​面​意​思​上​是​序​列​化​的​版​本​号​,凡是实现Serializable接口的类都有一个表示序列化版本标识符的静态变量。

JAVA序列化的机制是通过判断类的serialVersionUID来验证的版本一致的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID于本地相应实体类的serialVersionUID进行比较。如果相同说明是一致的,可以进行反序列化,否则会出现反序列化版本一致的异常,即是InvalidCastException。

为了提高serialVersionUID的独立性和确定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明确的值。

控制序列化字段还可以使用Externalizable接口替代Serializable借口。此时需要定义一个默认构造器,否则将为得到一个异常(java.io.InvalidClassException: PersonPersonno valid constructor);还需要定义两个方法(writeExternal()和readExternal())来控制要序列化的字段。

如下为将Person类修改为使用Externalizable接口。

transient修饰符仅适用于变量,不适用于方法和类。在序列化时,如果我们不想序列化特定变量以满足安全约束,那么我们应该将该变量声明为transient。执行序列化时,JVM会忽略transient变量的原始值并将默认值(引用类型就是null,数字就是0)保存到文件中。因此,transient意味着不要序列化。

静态变量不是对象状态的一部分,因此它不参与序列化。所以将静态变量声明为transient变量是没有用处的。