`

Java IO下---对象序列化与反序列化

    博客分类:
  • Java
阅读更多

 

今天我们主要来讲解一下对象序列化,首先我们需要知道什么是对象序列化,所谓的对象序列化就是将一个对象转换为二进制流,如果一个类的对象要想实现序列化,则该对象所在的类必须实现Serializable接口,在此接口中没有任何的方法,此接口只是作为一个标识,表示本类的对象具备了序列化的能力。

序列化的思想是“冻结”对象状态,传输对象状态(写到磁盘、通过网络传输等等),然后“解冻”状态,重新获得可用的Java对象,所有这些事情的发生有点像魔术,这要归功于ObjectInputStream/ObjectOutputStream类,完全保真的元数据以及程序员愿意用Serializable标识接口标记他们的类,从而“参与”这个过程。

序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例,如果某个类能够被序列化,其子类也可以被序列化。声明为statictransient类型的成员数据不能被序列化。因此static代表类的状态,transient代表对象的临时数据

对象序列化在一下场景使用比较合适:

a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;

b)当你想用套接字在网络上传送对象的时候;

c)当你想通过RMIRemote Method Invocation 远程方法调用)传输对象的时候;

 

 

 如果要想实现对象的序列化,则还要依靠ObjectOutputStream类和ObjectInputStream类,前者属于序列化操作,而或者属于反序列化操作。

 

package com.iflytek.io03;

import java.io.Serializable;

/**
 * @author xudongwang 2012-1-8
 * 
 *         Email:xdwangiflytek@gmail.com
 */
public class Person implements Serializable {
	private String name;
	private int age;

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

	public String toString() {
		return "姓名:" + this.name + ",年龄:" + this.age;
	}

	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;
	}

}

 

 下面通过ObjectOutputStream完成序列化操作:

 

package com.iflytek.io03;

import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

/**
 * @author xudongwang  2012-1-8
 *
 *  Email:xdwangiflytek@gmail.com
 */
public class ObjectOutputStreamDemo {
	public static void main(String args[]) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt");
		ObjectOutputStream oos = null;
		oos = new ObjectOutputStream(new FileOutputStream(file));
		Person per = new Person("王旭东", 21);
		oos.writeObject(per);
		oos.close();
	}

}

 

 对象被实例化之后,就可以通过ObjectInputStream进行反序列化的操作

 

package com.iflytek.io03;

import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

/**
 * @author xudongwang  2012-1-8
 *
 *  Email:xdwangiflytek@gmail.com
 */
public class ObjectInputStreamDemo {
	public static void main(String args[]) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt");
		ObjectInputStream ois = null;
		ois = new ObjectInputStream(new FileInputStream(file));
		Object obj = ois.readObject();
		Person per = (Person) obj;
		System.out.println(per);
	}

}

 

 以上操作实际上是整个对象进行的序列化操作,如果现在假设类中的某个属性不希望被序列化的话,则使用transient关键字进行声明;

 

private transient String name;

 

 由上面可知可以对一个对象序列化,那么因为Object可以接受任意的引用数据类型,所以也可以同时对多个对象一起进行序列化操作,包括数组;

 

package com.iflytek.io03;

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

/**
 * @author xudongwang  2012-1-8
 *
 *  Email:xdwangiflytek@gmail.com
 */
public class SerializableDemo {
	public static void main(String args[]) throws Exception {
		Person per[] = { new Person("张三", 30), new Person("李四", 40),new Person("王五", 50) };
		serializable(per);
		Person p[] = (Person[]) delSerializable();
		print(p);
	}
	public static void serializable(Object obj) throws Exception {
		File file = new File("d:" + File.separator + "demo.txt");
		ObjectOutputStream oos = null;
		oos = new ObjectOutputStream(new FileOutputStream(file));
		oos.writeObject(obj);
		oos.close();
	}
	public static Object delSerializable() throws Exception {
		Object temp = null;
		File file = new File("d:" + File.separator + "demo.txt");
		ObjectInputStream ois = null;
		ois = new ObjectInputStream(new FileInputStream(file));
		temp = ois.readObject();
		return temp;
	}
	public static void print(Person per[]) {
		for (Person p : per) {
			System.out.println(p);
		}
	}

}
 

 

1
1
分享到:
评论

相关推荐

    介绍Java对象序列化使用基础

    将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机。对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象...

    Java对象的序列化和反序列化实践

     把字节序列恢复为Java对象的过程称为对象的反序列化。  对象的序列化主要有两种用途:  1)把对象的字节序列地保存到硬盘上,通常存放在一个文件中;  2)在网络上传送对象的字节序列。  一、JDK类库...

    java-Hadoop序列化

     Java序列化(java.io.Serializable)  Hadoop序列化的特点  Hadoop的序列化格式:Writable  序列化格式特点:  紧凑:高效使用存储空间。  快速:读写数据的额外开销小  可扩展:可透明地读取老格式...

    深入分析Java的序列化与反序列化

     为什么实现了java.io.Serializable接口才能被序列化  transient的作用是什么  怎么自定义序列化策略  自定义的序列化策略是如何被调用的  ArrayList对序列化的实现有什么好处  Java对象的序列化  ...

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    5.3 实施过程 5.3.1 任务一 使用serializable序列化实体对象 5.3.2 任务二 反序列化将Person对象从磁盘上读出 Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第9页。 5.3.1 任务一 使用...

    Java IO流对象的序列化和反序列化实例详解

    主要介绍了Java IO流对象的序列化和反序列化实例详解的相关资料,需要的朋友可以参考下

    java.io.Serializable序列化问题

    java.io.Serializable序列化问题

    java IO数据操作流、对象序列化、压缩流代码解析

    主要介绍了java IO数据操作流、对象序列化、压缩流代码解析,具有一定借鉴价值,需要的朋友可以参考下

    java序列化和反序列化,面试必备

    反序列化:从IO流中恢复对象; 意义:序列化机制允许将实现序列化的Java对象转换为字节序列,并将字节序列保存在磁盘中,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使地对象可以脱离程序的运行而独立...

    java小项目练习IO实现

    IO实现本地序列化和反序列化,面向对象,集合等

    java笔试题输出结果-java-json-benchmark:JavaJSON库序列化和反序列化的性能测试

    java笔试题输出结果 Java JSON 库的基准测试 目的 该项目使用 . 它涵盖以下库: (来自Oracle) 如果可用,数据绑定和“流”(自定义打包和解包)实现都经过测试。 使用 1、10、100 和 1000 KB 大小的有效负载评估两...

    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编程入门教程 ...

    io_输入输出流_序列化反序列化_04.zip

    Java基础 IO file/输入输出/字节/字符流 BugReport 序列化/反序列化

    Java序列化与反序列化三种格式存取

     一般而言,要使得一个类可以序列化,只需简单实现java.io.Serializable接口即可(还要实现无参数的构造方法)。该接口是一个标记式接口,它本身不包含任何内容,实现了该接口则表示这个类准备支持序列化的功能。...

    Java基础知识点.html

    类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...

    java-io-guide:Java中的Java IO(输入和输出流)指南

    文件序列化示例 如何用Java将对象写入文件 如何从文件读取对象 文件压缩示例 用Java压缩ZIP格式的文件 从Java中的ZIP文件解压缩文件 目录 目录操作示例列表。 获取当前工作目录 建立目录 删除目录 复制目录 遍历...

    IO,Socket通讯,序列化.pptx

    IO,Socket通讯,序列化.pptx

    java源码包---java 源码 大量 实例

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    java 中序列化NotSerializableException问题解决办法

    主要介绍了java 中序列化NotSerializableException问题解决办法的相关资料,这里对序列化问题进行描述说明,并提供解决办法,希望能帮助到大家,需要的朋友可以参考下

    Java-Deserialization-Cheat-Sheet:关于Java反序列化漏洞的备忘单

    Java反序列化备忘单 面向渗透测试人员和研究人员的备忘单,其中涉及各种Java(JVM)序列化库中的反序列化漏洞。...Java反序列化安全性常见问题解答 来自Foxgloves安全 主要演讲,演讲和文档 编组泡菜 通过@frohoff &

Global site tag (gtag.js) - Google Analytics