`
ywChen
  • 浏览: 120108 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

对象的序列化与反序列化入门

    博客分类:
  • J2SE
JDK 
阅读更多

对象的序列化:把java对象转换为字节序列的过程。


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

 

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

 

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

 

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

 

JDK类库中的序列化API

 

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

 

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

 

注:只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则ObjectOuputStream的writeObject(Object obj)方法会抛出IOException。

 

对象的序列化主要包括以下步骤:

 

(1)创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出:

 

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\objectFile.obj"));

 

  (2)通过对象输出流的writeObjec(Object obj)方法写对象:

 

out.writeObject("hello");              //写一个String对象
out.writeObject(new Date());      //写一个Date对象

 

对象的反序列化主要包括以下步骤:

 

(1)创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流:

 

ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\objectFile.obj")));

 

  (2)通过对象输入流的readObject()方法读取对象:

 

String obj1 = (String)in.readObject();   //读取一个String对象
Date obj2 =(Date)in.readObject();       //读取一个Date对象

 

 

【例】对象的序列化与反序列化简单实现

    

 

 

public class ObjectSerialSample {
        //序列化对象存储路径
	private static final String objectFilePath ="d:\\objectFile.obj";
	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(objectFilePath));
		String obj1 ="hello";
		Date obj2 = new Date();
		Customer obj3 = new Customer("yw",25);
		//序列化对象
		out.writeObject(obj1);
		out.writeObject(obj2);
		out.writeObject(obj3);
		out.writeInt(1234);//写入基本类型的数据
		out.close();
		
		//反序列化
		ObjectInputStream in = new ObjectInputStream(new FileInputStream(objectFilePath));
		String obj11 = (String)in.readObject();
		System.out.println("obj11="+obj11);
		System.out.println("obj11==obj1:"+(obj11==obj1));
		
		Date obj22 =(Date)in.readObject();
		System.out.println("obj22:"+obj22);
		System.out.println("obj22==obj2:"+(obj22==obj2));
		
		Customer obj33 = (Customer)in.readObject();
		System.out.println("obj33:"+obj33);
		System.out.println("obj33==obj3:"+(obj33==obj3));
		//读取基本类型的数据
		int var = in.readInt();
		System.out.println("var:"+var);
		in.close();
		
	}
   

 

在String、Date和Customer对象进行反序列化时,都没有调用类的构造方法,而是直接根据它们的序列化数据在内存中创建新的对象

分享到:
评论

相关推荐

    java序列化原理与算法

    2. **对象持久化**:为了将内存中的对象状态保存到磁盘上,以备后续使用,也需要将对象序列化。 3. **对象复制**:在某些情况下,需要创建对象的精确副本,序列化是实现这一目的的有效手段之一。 #### Java序列化的...

    Java反序列化入门之URLDNS链1

    Java反序列化漏洞是一种安全问题,主要出现在Java应用程序中,当程序不安全地处理来自不可信源的反序列化数据时,攻击者可以构造恶意序列化对象,导致非预期的对象创建或代码执行。本文将深入探讨Java反序列化的基本...

    Java SE编程入门教程 java序列化(共14页).pptx

    Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 ...

    java反序列化漏洞入门总结.pdf

    根据提供的文档信息,我们可以深入探讨Java序列化与反序列化机制以及由此引发的安全漏洞问题。 ### Java序列化和反序列化概念及用途 #### 序列化 Java序列化是一种将对象状态转换为字节流的技术,使得对象可以被...

    PythonWeb从入门到实战教程之11前后分离、序列化、验证、保存.zip

    在本教程中,我们将深入探讨Python Web开发的关键概念,特别是针对初学者的“PythonWeb从入门到实战教程之11前后分离、序列化、验证、保存”。这个主题涵盖了Web开发中的多个重要方面,包括前端与后端的分离,数据...

    Jackson 入门Jackson 入门

    4. **Java类和枚举的序列化与反序列化**: - 如示例代码所示,Jackson可以轻松地处理复杂的Java类,包括嵌套类和枚举类型。 - `User`类有一个内部嵌套类`Name`,包含两个私有字段`_first`和`_last`,以及相应的...

    JavaSE基础入门视频教程33天之(25) part1

    JavaSE基础入门是Java编程学习的第一步,这个视频教程涵盖了33天的学习内容,其中第25天主要讲解了IO流对象以及与之相关的对象序列化。这些知识点对于初学者来说至关重要,因为它们是Java中数据传输和持久化存储的...

    Java面向对象考试常考简答题.docx

    * 序列化/反序列化机制:Java提供了序列化/反序列化机制来实现对象的持久化和网络传输。 十二、异常处理机制的基本含义和框架 * 异常处理机制的基本含义:异常处理机制是指程序在执行中出现的错误或错误情况的处理...

    JS实现的JSON序列化操作简单示例

    2. `replacer`:一个函数或数组,用于指定对象序列化时哪些属性需要被处理或被包含。 3. `space`:一个字符串或数字,用于在序列化的字符串中添加空白符,便于阅读。通常这个参数意义不大,可忽略。 `stringify`...

    jackson快速入门

    Jackson是Java领域中广泛使用的JSON处理库,它不仅支持JSON序列化和反序列化,还能进行数据绑定,使得Java对象和JSON数据之间可以方便地转换。这篇“Jackson快速入门”将带你快速掌握Jackson的核心功能和使用方法。 ...

    db4o面向对象数据库教程的入门教程

    它提供了高效的数据存储和检索功能,支持多种数据类型,并且能够直接存储复杂的对象结构而无需进行序列化或反序列化的操作。 - **开源**:作为一款开源软件,db4o允许开发者自由地获取其源代码并进行修改和分发。 - ...

    RMI入门小结

    4. RMI的序列化与反序列化: RMI要求所有跨JVM传输的对象都是可序列化的,因此,远程接口的实现类需要实现`java.io.Serializable`接口。Java会自动处理对象的序列化和反序列化过程。 5. RMI的优点: - 跨平台:...

    PHP序列化操作方法分析

    - `__wakeup()` 方法:在对象被反序列化时调用,可以用于执行如重新建立数据库连接等“数据恢复工作”。 ```php public function __wakeup() { $this->func(); // 恢复数据或执行操作 } ``` 3. 类的其他魔术方法 ...

    Castor入门实例,含完整jar包

    2. **序列化与反序列化**:Castor提供了API来实现对象到XML的序列化和XML到对象的反序列化。序列化是将Java对象转换成XML的过程,而反序列化则是相反的过程。 3. **类型转换**:Castor支持多种数据类型间的转换,...

    JSONtext-Object-Serialization:JSONtext的对象序列化策略

    JSONtext对象序列化序列化LabVIEW:trade_mark:对象。 目录关于该项目提供JSONtext扩展,以将对象从JSON序列化到JSON。建于入门要启动并运行本地副本,请遵循以下简单步骤。先决条件LabVIEW:trade_mark:2017或更高...

    开源软件包XStream及入门文档

    XStream是一款强大的开源Java库,主要用于XML和对象之间的序列化与反序列化。它的核心功能是将Java对象转换为XML格式的数据流,同时也可以将XML数据转换回对应的Java对象。这个过程被称为数据绑定。XStream通过简单...

    Jackson实例入门

    三、序列化与反序列化 1. **序列化**:将Java对象转换为JSON字符串。 ```java ObjectMapper mapper = new ObjectMapper(); User user = new User("张三", 25); String jsonString = mapper.writeValueAsString...

    protobuf入门.pdf

    序列化与反序列化 - **序列化**:将结构化的对象转换为二进制流,便于在网络传输或存储。 - **反序列化**:将二进制流还原为结构化的对象。 ### 4. protobuf的优势 - **效率**:protobuf的二进制编码方式比JSON...

    netty+protobuf入门案例

    通过这个案例,我们可以学习到如何结合Netty的高性能网络编程能力与Protobuf的高效数据序列化特性,构建出可靠且高效的网络通信应用。同时,这也为我们提供了实践异步编程和理解数据序列化协议的良好机会。

Global site tag (gtag.js) - Google Analytics