`

"java对象序列化与对象反序列化"深入详解

    博客分类:
  • java
阅读更多
• 将对象转换为字节流保存起来,并在以后还原这个对象,这种机制叫做对象序列化。 【比如内存里面有Person这样一个对象,这个对象已经new出来了,接下来我把这个对象保存到文件里面,因为内存里面的东西一旦java虚拟机关闭了就都没有了,所以保存到文件里面,保存到文件之后,等到下一次java虚拟机再次起来之后,我再把这个Person对象从文件里面读取回来,再加载到内存中。这就是序列化
• 将一个对象保存到永久存储设备上称为持久化。
• 一个对象要想能够实现序列化,必须实现Serializable接口或Externalizable接口。


一看到一个类实现了Serializable接口,编译器就知道这个类是可以序列化的。

• 序列化(serialization)是把一个对象的状态写入一个字节流的过程。当你想要把你的程序状态存到一个固定的存储区域例如文件时,它是很管用的。稍后一点时间,你就可以运用序列化过程存储这些对象

序列化是将文件存储到比如文件里面,反序列化是将这个对象从文件再加载回内存里面

• 假设一个被序列化的对象引用了其他对象,同样,其他对象又引用了更多的对象。这一系列的对象和它们的关系形成了一个顺序图表。在这个对象图表中也有循环引用。也就是说,对象X可以含有一个对象Y的引用,对象Y同样可以包含一个对象X的引用。对象同样可以包含它们自己的引用。对象序列化和反序列化的工具被设计出来并在这一假定条件下运行良好。如果你试图序列化一个对象图表中顶层的对象,所有的其他的引用对象都被循环的定位和序列化。同样,在反序列化过程中,所有的这些对象以及它们的引用都被正确的恢复。

• 当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量。
• 如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存。
• 如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列化。

• Serializable接口
–只有一个实现Serializable接口的对象可以被序列化工具存储和恢复。Serializable接口没有定义任何成员。它只用来表示一个类可以被序列化。如果一个类可以序列化,它的所有子类都可以序列化。
声明成transient的变量不被序列化工具存储。同样,static变量也不被存储


• ObjectOutput接口 (序列化里面特别重要的一个接口)
–ObjectOutput 继承DataOutput接口并且支持对象序列化。特别注意writeObject( )方法,它被称为序列化一个对象,把一个对象存放到例如文件里面。所有这些方法在出错情况下引发IOException 异常。

• ObjectOutputStream类
–ObjectOutputStream类继承OutputStream 类和实现ObjectOutput 接口。它负责向流写入对象。该类的构造方法如下:
–ObjectOutputStream(OutputStream outStream) throws IOException
–参数outStream 是序列化的对象将要写入的输出流。


• ObjectInput (序列化里面很重要的接口)
–ObjectInput 接口继承DataInput接口。它支持对象序列化。特别注意 readObject( )方法,它叫反序列化对象,是从文件里面读取出对象。所有这些方法在出错情况下引发IOException 异常。


• ObjectInputStream
–ObjectInputStream 继承InputStream 类并实现ObjectInput 接口。ObjectInputStream 负责从流中读取对象。该类的构造方法如下:
– ObjectInputStream(InputStream inStream) throws IOException,StreamCorruptedException
–参数inStream 是序列化对象将被读取的输入流。


反序列化时不会调用对象的任何构造方法,仅仅根据所保存的对象状态信息,在内存中重新构建对象



1.  一个类若想被序列化,则需要实现java.io.Serializable 接口,该接口中没有定义任何
方法,是一个标识性接口(Marker Interface),当一个类实现了该接口,就表示这个
类的对象是可以序列化的。
2.  在序列化时,static变量是无法序列化的;如果A包含了对B的引用,那么在序列化
A的时候也会将B一并地序列化;如果此时A可以序列化,B无法序列化,那么当
序列化A的时候就会发生异常,这时就需要将对B的引用设为transient,该关键字
表示变量不会被序列化【这两个方法定义在需要被序列化的类里面,这部分不是太重要,了解下即可】。
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
out.writeInt(age);
out.writeUTF(name);
out.writeDouble(height);

System.out.println("write object");
}

private void readObje(java.io.ObjectInputStream in) throws IOException {
age = in.readInt();
name = in.readUTF();
height = in.readDouble();

System.out.println("read object");
}
3.  当我们在一个待序列化/反序列化的类中实现了以上两个private方法(方法声明要
与上面的保持完全的一致),那么就允许我们以更加底层、更加细粒度的方式控制序
列化/反序列化的过程。






• 在序列化和反序列化进程中需要特殊处理的 Serializable 类应该实现以下方法:
•  private void writeObject(java.io.ObjectOutputStream stream) throws IOException;

•  private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException; 
  这两个方法不属于任何一个类和任何一个接口,是非常特殊的方法【这两个方法定义在需要被序列化的类里面,这部分不是太重要,了解下即可】.


下面是序列化与反序列化的一个使用示例(重点):
package com.shengshiyuan.serializable;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class SerializableTest1 {
	public static void main(String[] args) throws Exception {
		Person person = new Person(20, "hello", 3.45);
		Person person2 = new Person(30, "world", 4.45);
		Person person3 = new Person(40, "welcome", 5.45);

		FileOutputStream fos = new FileOutputStream("person.txt");
		ObjectOutputStream oos = new ObjectOutputStream(fos);

		oos.writeObject(person);
		oos.writeObject(person2);
		oos.writeObject(person3);

		oos.close();

		FileInputStream fis = new FileInputStream("person.txt");
		ObjectInputStream ois = new ObjectInputStream(fis);
		Person resPerson = (Person) ois.readObject();
		System.out.println(resPerson.getAge() + "," + resPerson.getName() + ","
				+ resPerson.getHeight());
		Person resPerson2 = (Person) ois.readObject();
		System.out.println(resPerson2.getAge() + "," + resPerson2.getName()
				+ "," + resPerson2.getHeight());
		Person resPerson3 = (Person) ois.readObject();
		System.out.println(resPerson3.getAge() + "," + resPerson3.getName()
				+ "," + resPerson3.getHeight());
ois.close();
	}
}

class Person implements Serializable {
	int age;
	transient String name;
	double height;

	public Person(int age, String name, double height) {
		this.age = age;
		this.name = name;
		this.height = height;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getHeight() {
		return height;
	}

	public void setHeight(double height) {
		this.height = height;
	}

}
分享到:
评论

相关推荐

    Java对象序列化标准最新版

    ### Java对象序列化标准知识点详解 #### 一、系统架构概览 **1.1 概览** Java 对象序列化是一种将Java对象的...以上内容涵盖了Java序列化标准的关键知识点,深入了解这些概念有助于更好地理解和应用Java序列化技术。

    Java中对象序列化与反序列化详解

    本文将深入探讨Java中的对象序列化与反序列化的概念、原理、实现方法以及相关的注意事项。 **一、对象序列化的概念和作用** 对象序列化是将一个Java对象转换成字节流的过程,这个字节流可以存储在磁盘上,也可以在...

    java序列化(Serializable)的作用和反序列化.doc

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化的概念 序列化是指将程序中的对象转换为一系列字节流的过程,主要用于保存对象的状态或在网络之间传输对象。序列化的主要目的是为了能够持久化...

    C#对象序列化与反序列化

    ### C#对象序列化与反序列化 #### 1. 对象序列化的介绍 ##### (1).NET支持对象序列化的几种方式 .NET框架提供了多种序列化机制,它们各自有不同的应用场景和特点。 - **二进制序列化**: - **定义**:二进制...

    Java对象序列化

    ### Java对象序列化详解 #### 一、Java对象序列化概念 Java对象序列化是指将一个Java对象的状态信息转换成可以存储或传输的形式的过程。在这个过程中,对象的信息被编码成一系列字节,以便可以在文件系统中保存...

    java序列化(Serializable)的作用和反序列化

    ### Java序列化(Serializable)的作用与反序列化详解 #### 一、序列化是什么? 序列化是指将程序中的对象转换为字节流的过程,从而方便存储或传输这些对象。通常,序列化用于将对象的状态(即其实例变量的值,而非...

    java序列化和反序列化

    ### Java序列化与反序列化详解 #### 一、Java序列化概述 Java序列化(Serialization)是一项重要的功能,它可以将对象的状态转化为一系列字节,从而实现对象的持久化存储或在网络上传输。序列化机制使得Java对象...

    java序列化全解

    Java序列化是Java平台中的一种核心机制,它允许对象的状态被转换成字节流,以便存储到磁盘、数据库,或者在网络中进行传输。这对于实现持久化、远程方法调用(RMI)以及Enterprise JavaBeans(EJB)等高级功能至关...

    Java 对象序列化详解以及实例实现和源码下载

    Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...

    Java安全漫谈 - 07.反序列化篇(1)1

    在Java中,`readObject`方法被设计用来在反序列化过程中恢复对象的状态。与PHP的`__wakeup`魔术方法不同,`readObject`不仅用于初始化对象,更着重于重建对象的所有属性和状态,包括那些可能在序列化过程中自定义...

    java序列化原理与算法

    ### Java序列化原理与算法详解 #### 序言 在现代软件开发中,尤其是在网络通信和数据持久化领域,对象的序列化与反序列化扮演着至关重要的角色。Java作为一种广泛应用的编程语言,提供了强大的内置支持来实现序列化...

    Java反序列化实战.pdf

    ### Java反序列化实战知识点详解 #### 一、反序列化概述 - **定义**:在计算机科学领域,反序列化是指将字节流或文本流等数据转换回其原始对象结构的过程。这一过程通常与序列化相对应,序列化是将对象的状态转化...

    什么是Java的序列化和反序列化?如何实现对象的序列化和反序列化?(java面试题附答案).txt

    ### Java中的序列化与反序列化详解 #### 一、概念理解 在Java中,序列化(Serialization)指的是将对象的状态转化为字节流的过程,这一过程通常用于存储对象或者在网络中传输对象。相反地,反序列化...

    Json序列化与反序列化详解

    本文将深入探讨JSON的序列化与反序列化过程,以及如何使用Gson、FastJson和Jackson这三种流行的Java库来实现这一功能。 一、什么是JSON序列化与反序列化? 1. JSON序列化:序列化是指将Java对象转换为JSON字符串的...

    java 序列化与反序列化的实例详解

    java 序列化与反序列化的实例详解 Java 序列化与反序列化是 Java 编程语言中的一种机制,允许将 Java 对象转换为字节序列,并将其反序列化回 Java 对象。序列化是指将 Java 对象转换为字节序列的过程,而反序列化是...

    Java序列化和反序列化

    ### Java序列化与反序列化的深入解析 #### 序列化的功能与意义 序列化是Java编程语言中的一项核心功能,其主要目的是将对象的状态转换为可以存储或传输的格式,便于持久化保存或网络传输。序列化并不涉及对象的...

    Java对象序列化操作详解

    Java 对象序列化操作详解 Java 对象序列化是 Java 语言中一种重要的机制,它允许将 Java 对象转换为字节序列,以便在网络上传送或保存到文件中。对象序列化操作主要有两种用途:把对象的字节序列永久地保存到硬盘上...

    序列化与反序列化详解

    ### 序列化与反序列化详解 #### 一、概念理解 序列化与反序列化是编程领域中非常重要的技术之一,它们主要用于将对象的状态转换为可以存储或传输的形式,以便于对象状态的持久化或者跨进程传输。具体而言: - **...

    msgpack工具库二进制格式序列化反序列化

    **序列化与反序列化** 序列化是将对象转换为可存储或可传输的形式的过程,而反序列化则是将这种形式的数据恢复为原来的对象。MsgPack库通过高效地编码和解码数据结构,实现了快速的序列化和反序列化。这在处理大量...

    详解Java 对象序列化和反序列化

    Java提供了内置的支持来进行对象的序列化和反序列化,主要通过实现`java.io.Serializable`接口来实现。 1. **简洁的代码实现** Java对象序列化的简化代码主要体现在使用`ObjectOutputStream`和`ObjectInputStream`...

Global site tag (gtag.js) - Google Analytics