`
hz_chenwenbiao
  • 浏览: 1007914 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JAVA语言序列化和反序列化一目了然(一)认识[上](转)

阅读更多

在JAVA中,一个大的应用程序需要保存很多对象的时候,由于虚拟机内存有限,(资源宝贵啊 )有时不可能所有有用的对象都放到内存中,因此,需要将不常用的对象暂时持久化的文件中,当需要这个对象时,再从文件把对象恢复到内存中,这就是所谓对象的序列化和反序列化。本文讲实现如何将对象序列化到文件,然后再从文件反序列化到对象,你会发现其实特别简单

 

先看一下对象的序列化和反序列化的关键是什么

1,首先被序列化的对象必须实现 java.io.Serializable 接口,咳~~咳~~,其实这个接口没定义任何方法

 

2,序列化时,需要用到对象输出流ObjectOutputStream ,然后通过文件输出流构造 ObjectOutputStream 对象调用writeObject写入到文件

 

3,反之,反序列化时用到对象输入流ObjectIntputStream,  然后通过文件输出流构造 ObjectIntputStream对象调用readObject加载到内存,注意,是返回万能Object类型

 

4,注意:序列化时transient变量(这个关键字的作用就是告知JAVA我不可以被序列化)和静态变量不会被序列化(关于静态变量不会序列化保留意见,本实例先不用静态变量)

 

5,也是最应该注意的,如果你先序列化对象A后序列化B,那么在反序列化的时候一定记着JAVA规定先读到的对象是先被序列化的对象,不要先接收对象B,那样会报错

 

好了,现在我们做一个实例,我们现在要序列化一个会员对象到文件里,然后再把它读出来

先创建会员类

import java.io.*;
import java.util.*;

//一定要实现Serializable接口才能被序列化
public class UserInfo implements Serializable {
	public String userName;
	public String userPass;
	//注意,userAge变量前面的transient
	public transient int userAge;

	public UserInfo(){
	}

	public UserInfo(String username,String userpass,int userage){
		this.userName=username;
		this.userPass=userpass;
		this.userAge=userage;
	}

	public String toString(){
		return "用户名: "+this.userName+";密码:"+this.userPass+
			";年龄:"+this.userAge;
	}
}

 接着我们开始写如何序列化和反序列化,初学认真看哦

import java.io.*;
import java.util.*;
public class Test {

	//序列化对象到文件
	public static void serialize(String fileName){
		try
		{
			//创建一个对象输出流,讲对象输出到文件
			ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName));

			out.writeObject("序列化日期是:");	 //序列化一个字符串到文件

			out.writeObject(new Date());	//序列化一个当前日期对象到文件

			UserInfo user=new UserInfo("renyanwei","888888",20);
			out.writeObject(user);	//序列化一个会员对象

			out.close();
		}
		catch (Exception x)
		{
			System.out.println(x.toString());
		}
		
	}
	//从文件反序列化到对象
	public static void deserialize(String fileName){
		try
		{
			//创建一个对象输入流,从文件读取对象
			ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName));

			//注意读对象时必须按照序列化对象顺序读,否则会出错
			//读取字符串
			String today=(String)(in.readObject());
			System.out.println(today);

			//读取日期对象
			Date date=(Date)(in.readObject());
			System.out.println(date.toString());

			//读取UserInfo对象并调用它的toString()方法
			UserInfo user=(UserInfo)(in.readObject());			
			System.out.println(user.toString());

			in.close();
		}
		catch (Exception x)
		{
			System.out.println(x.toString());
		}
		
	}

	public static void main(String[] args) {	
		serialize("D:\\test.txt");
		System.out.println("序列化完毕");

		deserialize("D:\\test.txt");
		System.out.println("反序列化完毕");
	}

}

运行结果:


序列化完毕
今天是:
Thu Oct 23 18:31:11 CST 2008
用户名: renyanwei;密码:888888;年龄:0
反序列化完毕

我们看代码总结一下,serialize方法实现了对象的序列化功能,讲对象序列化到文件,使用了文件的输出流ObjectOutputStream 的writerObject方法一次写入一个对象,对象在文件中按写入顺序存储。

deserialize方法实现反序列化,从文件将对象反序列化到内存,使用了ObjectIntputStream 的readObject方法,因为序列化对象是按照写入顺序存储的,所以在反序列化时必须按照写入顺序读取

大家看了结果就应该知道了,标明transit的实例变量是没被序列化进去的 ,呵呵

 

其实序列化的意义不止如此,不但可以将对象放到文件流,还可以放到网络流里,比如我们做的Socket程序,你不但可以发送给对方一行消息,还可以发送过去一个对象,我估计QQ就不止是把我们的消息发送到对方,应该是一个对象,里面包含了发送者的信息什么的。呵呵 有兴趣的可以做一下哈

分享到:
评论

相关推荐

    Java反序列化终极测试工具

    Java反序列化漏洞通常出现在以下场景:当一个不可信的输入源(例如网络流或外部文件)被用来反序列化对象时,恶意用户可能会构造特殊的序列化数据来触发非预期的行为,比如执行任意代码。这种漏洞在许多大型系统中曾...

    Java反序列化终极测试工具.zip

    2. **Java反序列化终极测试工具**:这是一个通用的反序列化测试工具,适用于多种Java环境,包括WebLogic和Websphere等。它可能包含了一系列预设的payloads(即恶意序列化对象),可以用来检查应用程序是否容易受到反...

    将dataset json序列化和反序列化成dataset (非常不容易做完了)

    .net 将dataset json序列化和反序列化成dataset JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition - ...

    Java反序列化漏洞利用工具.zip

    Java反序列化漏洞是软件安全领域的一个重要话题,它涉及到Java应用程序在处理序列化和反序列化过程中的安全问题。序列化是将对象状态转换为可存储或传输的数据格式的过程,而反序列化则是将这些数据恢复为原来的对象...

    Java反序列化漏洞探析及其修复方法研究.pdf

    - Java反序列化漏洞的背景和原理:2015年发现的一种新型信息安全高危漏洞,由于Java语言的序列化机制存在缺陷,攻击者可以利用漏洞执行远程任意代码。 - 漏洞的影响范围:广泛影响基于Java编写的应用程序,包括但不...

    java反序列化终极测试工具.zip

    标题中的“java反序列化终极测试工具.zip”暗示这是一个专门针对Java反序列化漏洞进行测试的工具包。这个工具可能包含了多种针对不同应用服务器(如JBoss、Websphere、Weblogic)的测试用例,这些服务器都是企业级...

    java反序列化工具

    `ysoserial`是给定的压缩包文件中的一个项目,这是一个著名的Java反序列化漏洞测试工具。开发者和安全研究人员使用ysoserial来生成能够触发特定漏洞的序列化对象。这个工具可以帮助识别和测试应用程序中的反序列化...

    Java反序列化漏洞检查工具V1.2_Weblogic XML反序列化漏洞检查工具CVE-2017-10271

    Java反序列化漏洞是软件安全领域的一个重要话题,特别是在企业级应用服务器如Weblogic中,这类漏洞可能导致远程代码执行、系统权限提升等严重后果。工具"Java反序列化漏洞检查工具V1.2_Weblogic XML反序列化漏洞检查...

    序列化、反序列化源码

    总的来说,理解和掌握序列化和反序列化对于任何程序员来说都是非常重要的技能,特别是在C++这样的强类型语言中。通过深入研究"StreamTest"项目,你可以更直观地了解如何在实际代码中应用这些概念。

    java反序列化漏洞-验证.rar

    Java反序列化漏洞是软件安全领域的一个重要话题,尤其对于使用Java进行开发的系统来说,理解和防范这种漏洞至关重要。在Java编程中,序列化和反序列化是常见的数据传输和持久化手段,允许对象的状态被转换为字节流,...

    Java反序列化工具.zip

    反序列化漏洞则是一个安全问题,攻击者可以通过构造恶意的序列化数据来利用这种漏洞,执行任意代码或获取服务器权限。 标题"Java反序列化工具.zip"暗示了这个压缩包包含了一些工具,这些工具可能是为了帮助开发者...

    Java反序列化漏洞利用工具V1.7.jar

    Java反序列化漏洞利用工具

    XML序列化/反序列化类

    XML序列化/反序列化类,放到项目中直接使用,很方便。 SerializationHelper

    java反序列香草

    在标题和描述中提到的“java反序列香草”很可能是一个工具,专门用于检测和利用Java应用中的反序列化漏洞。这类工具对于安全研究人员进行渗透测试和漏洞评估至关重要,它们可以帮助开发者识别并修复潜在的安全隐患。...

    Java反序列化终极检测工具_Jboss & Weblogic & Websphere.zip

    这个压缩包文件“Java反序列化终极检测工具_Jboss & Weblogic & Websphere.zip”似乎包含了一些资源,可能是用于帮助开发者或安全研究人员检测这些Java应用服务器中的反序列化漏洞。 **反序列化过程** 在Java中,...

    java反序列化漏洞工具

    同时,了解并学习如何防御Java反序列化漏洞也很重要,这包括限制可接受的序列化类型、使用安全的反序列化库(如Apache Commons Lang的SerializationUtils)以及保持应用程序和服务器软件的更新。 总的来说,Java...

    shiro反序列化测试工具.zip

    在网络安全领域,"反序列化漏洞"是一种常见的安全问题,攻击者可以通过构造恶意的序列化数据来执行远程代码或者获取敏感信息。Shiro框架在处理用户认证和授权时可能会涉及对象的序列化和反序列化,因此也可能存在...

    Java反序列化漏洞利用集成工具

    这个“Java反序列化漏洞利用集成工具”很可能是一个用于测试和分析Java应用中反序列化漏洞的工具集。下面,我们将深入探讨Java反序列化、漏洞成因、潜在风险以及如何利用和防范这些漏洞。 **什么是Java反序列化?** ...

    javaRMI反序列化漏洞验证工具

    这个技术的核心是序列化和反序列化过程,它使得对象可以在网络上进行传输。然而,这个特性也可能引入安全风险,尤其是当不安全的对象被反序列化时,可能导致代码执行、权限提升或其他恶意行为。 **Java RMI反序列化...

Global site tag (gtag.js) - Google Analytics