`
crazy_rabbit
  • 浏览: 34608 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

对象的序列化和反序列化

阅读更多

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。 

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

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

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

  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

  2) 在网络上传送对象的字节序列。

Java语言中要求只有实现了java.io.Serializable接口的类的对象才能被序列化及反序列化。JDK类库中的有些类(如String类、包装类(Java语言用包装类来把基本类型数据转换为对象,基本类型数据有四类八种)和Date类等)都实现了Serializable接口。

对象的序列化包括以下步骤。

 

  1. 创建一个对象输出流,它可以包装一个其他类型的输出流,比如文件输出流。
  2. 通过对象输出流的writeObject()写对象。

 

 

对象的反序列化包括以下步骤。

 

  1. 创建一个对象输入流,它可以包装一个其他类型的输入流,比如文件输入流。
  2. 通过对象输入流的readObject()方法读取对象

 

其次在对象的序列化和反序列化过程当中,必须注意的事情是:为了能读出正确的数据,必须保证对象输出流的写对象的顺序与对象输入流读对象的顺序是一致的。

 

 

 写道
package ser;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Date;

public class ObjectSaver {
public static void main(String[] args) throws Exception{
//1、创建一个对象输出流,它可以包装一个其他类型的输出流,比如文件输出流
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\objectFile.obj"));

String obj1 = "hello";

Date obj2 = new Date();

Customer obj3 = new Customer("WeiDong",24);
//2、通过对象输出流的out.writeObject()写对象——序列化对象
out.writeObject(obj1);
out.writeObject(obj2);
out.writeObject(obj3);
out.close();

//3、创建一个对象输入流,它可以包装一个其他类型的输入流,比如文件输入流——反序列化对象
ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\objectFile.obj"));
String obj11 = (String)in.readObject();
System.out.println(obj11);
System.out.println("obj11==obj1:" + (obj11==obj1));
System.out.println("obj11.equals(obj1):" + (obj11.equals(obj1)));

Date obj22 = (Date)in.readObject();
System.out.println(obj22);
System.out.println("obj22==obj2:" + (obj22==obj2));
System.out.println("obj22.equals(obj2):" + (obj22.equals(obj2)));

Customer obj33 = (Customer)in.readObject();
System.out.println(obj33);
System.out.println("obj33==obj3:" + (obj33==obj3));
System.out.println("obj33.equals(obj3):" + (obj33.equals(obj3)));
in.close();
}
}

 package ser;

import java.io.Serializable;

public class Customer implements Serializable {
	private String username;
	
	private int age;
	
	public Customer(String username,int age) {
		this.username = username;
		this.age = age;
	}
	@Override
	public boolean equals(Object o) {
		if(this==o) {
			return true;
		}
		
		if(!(o instanceof Customer)) {
			return false;
		}
		
		final Customer other = (Customer)o;
		
		if(this.username.equals(other.username)&&(this.age==other.age)) {
			return true;
		}else {
			return false;
		}
	}
	@Override
	public String toString() {
		return "username = " + username + "age = " + age;
	}
	
	

}

 

通常对象中的所有属性会被序列化,但是对于一些敏感的信息(比如用户的口令),一旦被序列化后,人们就可以通过读取文件或者拦截网络传输数据的方式来偷窥这些信息。因此处于对安全原因的考虑,应该禁止对这种属性进行说序列化。解决这种办法是把这种属性用transient来进行修饰,例如以下代码。


 package ser;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/*
 * 属性包括用户名username和密码password
 * 构造方法来为对象的属性赋予合适的值
 */
public class User implements Serializable{
	
	private String username;
	
	private transient String password;
	
	public User(String username,String password) {
		this.username = username;
		
		this.password = password;
	}

	@Override
	public String toString() {
		return username + "" + password;
	}
	
	public static void main(String[] args) throws Exception{
		User user = new User("WeiDong","123456");
		
		System.out.println("Before Serialization:" + user);
		
		ByteArrayOutputStream buf = new ByteArrayOutputStream();
		//创建一个对象输出流,通过对象输出流的writeObject()写对象到输出流中
		ObjectOutputStream out = new ObjectOutputStream(buf);
		
		out.writeObject(user);
		
		out.close();
		//创建一个对象输入流,通过对象输入流的readObject()从输入流中读取对象
		ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(buf.toByteArray()));
		
		user = (User)in.readObject();
		
		System.out.println("After Serialization:" + user);
		
		in.close();
	}
	
}
 

 

 

分享到:
评论
1 楼 yidao620c 2009-08-21  
嗯。学习了。

相关推荐

    Java对象序列化和反序列化工具Xson.zip

    Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven:  <groupId>com.github.xsonorg</groupId>  <artifactId>xson-core  <version>1.0.1 ...

    java对象序列化和反序列化

    综上,Java对象序列化和反序列化是Java开发中的基础技能,它们在数据持久化、网络通信等方面发挥着关键作用。了解并掌握这些知识,能够帮助开发者更好地设计和实现各种功能。在实际应用中,需要注意安全性和版本兼容...

    c#对象序列化和反序列化,压缩流

    在C#编程中,对象序列化和反序列化是至关重要的技术,它们允许我们将对象的状态转化为可存储或可传输的数据格式,例如XML、JSON或二进制,以便于保存、恢复或者在网络间传递。而“压缩流”则涉及到数据的压缩和解...

    对象序列化和反序列化流.xmind

    对象序列化和反序列化流

    对象序列化和反序列化是怎么回事

    对象序列化和反序列化是计算机编程中的重要概念,尤其在数据存储、网络通信和状态保存等场景下广泛应用。在Java、C#等面向对象语言中,这些操作扮演着关键角色。本文将深入探讨对象序列化和反序列化的概念、用途、...

    C#对象序列化反序列化保存与读取和对象直接保存与读取

    本主题将深入探讨如何在Windows Forms(WF)环境中,利用C#语言进行对象的直接保存与读取,以及通过对象序列化和反序列化的方式实现对象的保存与恢复。 首先,我们来理解什么是对象的直接保存与读取。在C#中,可以...

    c#对象序列化与反序列化实例

    在C#编程中,对象序列化和反序列化是至关重要的技术,它们允许开发者将复杂的对象状态转换为可存储或可传输的数据格式,如XML、JSON或二进制流。对象序列化通常用于持久化数据、跨进程通信、网络传输等场景。下面...

    java 对象的序列化与反序列化

    Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...

    基于C#+XML实现的对象序列化与反序列化的程序例子代码

    对象序列化和反序列化是软件开发中常用的技术,特别是在数据存储、网络传输以及状态保存等领域。在.NET框架中,C#提供了强大的支持来实现这一功能。本篇将详细讲解如何利用C#和XML来实现对象的序列化与反序列化。 ...

    C++ JSON 序列化与反序列化

    1. 复杂类型的处理:除了基本类型外,还可以序列化和反序列化自定义类、结构体以及容器(如vector、map等)。对于自定义类型,通常需要重载`operator和`operator>>`,或者使用nlohmann/json库中的`to_json`和`from_...

    对象的序列化和反序列化1

    在Java编程中,对象的序列化和反...总之,Java中的对象序列化和反序列化是处理对象状态的重要工具,适用于多种场景,但同时也需要注意其潜在的安全和性能影响。理解这些概念对于编写高效、安全的Java应用程序至关重要。

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

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

    序列化和反序列化的封装类

    在编程领域,序列化和反序列化是两个关键的概念,特别是在数据存储、网络传输和对象持久化等场景中。它们允许我们将对象的状态转换为字节流(序列化),然后在需要的时候将字节流还原为原来的对象(反序列化)。在C#...

    序列化和反序列化dll文件和proto

    在IT领域,序列化和反序列化是两个关键的概念,特别是在数据存储、网络通信和分布式系统中。它们涉及将对象的状态转换为可持久化的格式(序列化),以及将这种格式还原回原来的对象(反序列化)。本文将深入探讨这两...

    反序列化作用

    在分布式计算和网络编程中,对象序列化和反序列化是实现远程对象调用和跨平台数据交换的基础。它允许对象状态跨越不同网络节点传输,实现对象的“深复制”。同时,在EJB、JMS等技术框架中也广泛使用了序列化机制,...

    hessian学习基础篇——序列化和反序列化

    在IT领域,序列化和反序列化是两个关键的概念,特别是在网络通信、数据持久化以及对象存储中。本文将深入探讨Hessian框架的基础知识,它是一个高效的二进制序列化协议,广泛应用于Java和.NET之间跨语言通信。通过...

    用Javascript将form所有内容序列化和反序列化的例子。

    - **支持嵌套数据结构**:如果表单数据包含数组或对象,可能需要自定义序列化和反序列化逻辑,例如使用JSON.stringify()和JSON.parse()。 在`index.html`中,你可以创建一个表单,并在JavaScript文件(js)中实现上述...

    java序列化和反序列化的方法

    java 序列化和反序列化的方法 Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在...

    学生管理系统(序列化和反序列化)

    序列化和反序列化是这个系统的关键技术,它们允许程序将对象的状态转化为可存储或传输的形式,然后在需要时还原为原来的对象。以下是对这两个概念的详细解释以及在学生管理系统中的应用。 1. **序列化**:序列化是...

    JAVA对象的序列化与反序列化详细PPT课件.pptx

    前者代表对象输出流,具备`writeObject(Object obj)`方法,可以将对象序列化并写入到目标输出流;后者代表对象输入流,其`readObject()`方法能从输入流中读取字节流并反序列化为对象。 为了使一个Java对象能够被...

Global site tag (gtag.js) - Google Analytics