`
xplq
  • 浏览: 89897 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

对象的串行化(Serialization)和反串行化(deserialization)

阅读更多
串行化(serialization)是指将一个对象的当前状态转换成字节流(a stream of bytes)的过程,而反串行化(deserialization)则指串行化过程的逆过程,将字节流转换成一个对象,打回原形
一、串行化的意义:
1:解决Web应用程序的无状态弊端
一旦将某一对象串行化,得到的字节可以存储在文件、数据库,或内存中—— 只要是可以存储的任何地方。需要恢复对象时,仅仅只需从它存储的位置反串行化即可。对象固有的这种特性对于无状态的Web应用程序是非常重要的,因为它允许重要的状态信息可以在用户请求之间保留。
2:应用程序边界之间传递对象
串行化也允许对象在应用程序边界之间传递,编程人员可以将描述对象状态的字节流在网络上传递,并在另一端反串行化成一个匹配的对象。从本质上讲,串行化允许对象以“数值”的方式传递给另一个应用程序。
二:串行化对象
在java中串行化对象必须:
1、该对象的类必须实现Serializable接口
2、该对象的串行化成员必须是非静态成员变量,即不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。而对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的,例如一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明 。
注:保存任何的成员方法和静态的成员变量没有任何的意义,因为,对象的类已经完整的保存了他们,如果再串行化他们还有什么意义呢?呵呵
3、要串行化一个对象,必须与一定的对象输入/输出流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。
三:具体实现
1、串行化的对象:Person类
import java.io.Serializable;
/*  
 * time:2008-07-19  
 * author:coke  
 */ 

/*
 *必须实现Serializable 
 */
public class Person implements Serializable {
	private static final long serialVersionUID = 1L;
	private int age; // will persist
	private String name; // will persist
	// transient 为Java保留字,告诉JVM以transient宣告的基本型态(primitive type)或物
	// 件(object)变量不要序列化,例如敏感性数据像是密码等。
	private transient String pwd; // will not persist
	public Person() {
	}

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

	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 String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
}

2、串行化和反串行化
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;
/*
 * time:2008-07-19
 * author:coke
 */
public class TestSerializable {
	private static File f = null;

	//串行化
	public static void serialization() {
		f = new File("D://t.m");
		try {
			if (f.exists())
				f.delete();
			f.createNewFile();

		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		Person p = new Person(10, "xplq", "123456");
		try {
			ObjectOutputStream out = new ObjectOutputStream(
					new FileOutputStream(f));
			out.writeObject(p);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	//反串行化
	public static void deserialization() {
		if (!f.exists())
			return;
		try {
			ObjectInputStream input = new ObjectInputStream(
					new FileInputStream(f.getPath()));
			try {
				Person p = (Person) input.readObject();
				System.out.println(p.getName());
				System.out.println(p.getAge());
				System.out.println(p.getPwd());
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//测试
	public static void main(String[] args) {
		TestSerializable.serialization();
		TestSerializable.deserialization();
	}

}

3.测试结果
xplq
10
null
因为pwd transient ,不能被串行化
分享到:
评论
3 楼 bloodrate 2008-07-20  
串行化(serialization)是指将一个对象的当前状态转换成字节流(a stream of bytes)的过程。。。一直不理解这句话,在计算机里所有数据都是以“0”,“1”存储的,对象不串行化难道就不是字节了么??
2 楼 xplq 2008-07-20  
cxj_2000 写道
现在感觉一扯上java,就一定要扯上web,唉。

串行化根本不是为了解决“1:解决Web应用程序的无状态弊端 ”这个问题的。

还有,还可以实现另外一个接口来自定义串行化跟反串行化过程。

请赐教
1、“串行化”的意义
2、还可以实现哪一个接口来自定义串行化跟反串行化过程?
小弟不胜感激
1 楼 cxj_2000 2008-07-19  
现在感觉一扯上java,就一定要扯上web,唉。

串行化根本不是为了解决“1:解决Web应用程序的无状态弊端 ”这个问题的。

还有,还可以实现另外一个接口来自定义串行化跟反串行化过程。

相关推荐

    C#344-对象串行化源代码

    .NET Framework会自动处理对象的串行化和反串行化,但无法处理私有字段和受保护字段。对于这些情况,可以使用[NonSerialized]特性来排除字段。 3. **BinaryFormatter**: .NET框架提供的BinaryFormatter类是默认的...

    C# 对象串行化输入输出 演示代码

    描述中提到的代码可能涉及到使用BinaryFormatter进行对象串行化和反串行化的操作。以下是一个简单的例子: ```csharp using System.IO; using System.Runtime.Serialization.Formatters.Binary; // 假设有一个Bmp...

    详解PHP对象的串行化与反串行化

    在PHP编程中,串行化(Serialization)和反串行化(Unserialization)是两种重要的数据处理技术。它们允许开发者将复杂的数据结构,包括对象,转换为字符串形式,便于存储或者在网络上传输。当我们需要暂时保存对象...

    PHP串行化与反串行化实例分析

    在PHP编程中,串行化(Serialization)和反串行化(Unserialization)是两种重要的数据处理技术。它们主要用于将复杂的数据结构,如对象,转换为字符串以便存储或传输,然后再将这些字符串恢复为原始数据结构。这在...

    实例解析C++/CLI的串行化

    而反串行化(Deserialization)则是将串行化后的数据重新恢复为对象的过程。C++/CLI(C++ Common Language Infrastructure)是微软公司为C++语言扩展设计的,使得C++能够更容易地与.NET环境进行交互,支持托管代码和...

    串行化保存和读取数据示例.zip

    3. **readObject()和writeObject()**:对于复杂的对象,可以重写`writeObject()`和`readObject()`方法来自定义串行化和反串行化的行为。这些方法允许你精确地控制哪些数据应该被保存和恢复。 4. **Externalizable...

    C#图形对象的串行化实例

    接下来,我们可以使用`BinaryFormatter`类来进行串行化和反串行化操作: ```csharp using System.IO; using System.Runtime.Serialization.Formatters.Binary; // 串行化 public static void ...

    java串行化详细的介绍了java串行化的概念

    序列化是Java编程中一项重要的技术,它能够帮助开发者实现对象的持久化和网络传输等功能。通过理解序列化的原理和实现机制,开发者可以更好地利用这一特性来提高应用程序的灵活性和扩展性。同时,合理地设置`...

    序列化和反序列化 Serialization

    数据的序列化和反序列化 Serialization DeSerialization

    串行化(Serialization)示范例子

    串行化是微软提供的用于对对象进行文件I/O的一种机制,该机制在框架(Frame)/文档...很多人对什么是串行化、怎么使对象具有串行化能力和如何使用串行化功能等问题都 不甚明了。本文试图对串行化做一个简单的解释。

    mfc 串行化的简单使用

    在这个类中,你需要重写`OnSerialize`函数,该函数会在对象被串行化或反串行化时被调用。 2. **实现`OnSerialize`函数**:在这个函数中,你需要调用基类版本的`OnSerialize`函数,并且根据`CArchive`对象的模式...

    MFC 文档串行化

    标题“MFC 文档串行化”主要涉及到两个核心概念:文档类(CDocument)和串行化(Serialization)。文档类是MFC框架的一部分,它是与用户交互的数据容器,通常继承自`CObject`,并进一步继承自`CDocument`。而串行化...

    串行化和图像读取显示

    串行化是将对象的状态转换为可以存储或传输的数据的过程,而图像显示则涉及到图像处理和计算机图形学,通常与用户界面和多媒体应用息息相关。下面将详细探讨这两个主题。 首先,我们来看“串行化”。在编程中,串行...

    Visual Basic.NET 串行化参考手册(PDG)

    2.二进制串行化:使用System.Runtime.Serialization.Formatters.Binary命名空间中的BinaryFormatter类,将对象转换为二进制格式的数据。 实现XML串行化: 首先,你需要在要串行化的类上添加Serializable特性,表示...

    Java关键字Transient与串行化

    串行化(Serialization)是将对象的状态转换为字节流的过程,以便于存储或在网络上传输。Java提供了强大的串行化机制,允许程序员将任何实现了`Serializable`接口的对象转化为字节流,并将其写入文件或其他输出流中...

    PHP中串行化用法示例

    在类中定义了`__construct`构造函数用于初始化对象,`say`方法用于返回对象的属性信息,`__sleep`和`__wakeup`是两个特殊方法,它们分别在串行化和反串行化过程中被调用。 - `__sleep`方法用于在串行化之前指定哪些...

    基于对话框工程的串行化-可用于保存配置

    在C++编程中,串行化(Serialization)是一种将数据对象转换为可存储或传输的形式的过程,通常用于保存程序的状态或者配置信息。在Visual Studio 2010中,开发基于对话框的应用程序时,虽然单文档(SDI)和多文档...

    Visual Basic.NET 串行化参考手册

    在.NET框架中,Visual Basic .NET(VB.NET)是一种面向对象的编程语言,它提供了丰富的功能,其中之一就是串行化。串行化是将对象的状态转换为可存储或可传输的形式的过程,通常用于持久化数据或者在网络间传输对象...

    MFC文档的串行化与保存

    文档串行化(Serialization)是MFC中实现文件保存和加载的关键机制,它允许将文档对象的状态转换为字节流,以便于存储到磁盘或在网络上传输。下面我们将深入探讨MFC文档的串行化以及如何实现保存功能。 **1. MFC...

Global site tag (gtag.js) - Google Analytics