1.概念

  Java的“对象序列化”能将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象的时候,能把这些byte数据恢复出来,并据此重新构建那个对象。

  对象序列化能实现“轻量级persistence(lightweight persistence)”。所谓persistence,是指对象的生命周期不是由程序是否运行决定的,在程序的两次调用之间对象仍然还活着。通过“将做过序列化处理的对象写入磁盘,等到程序再次运行的时候再把它读出来”,可以达到persistence的效果。

  之所以要在语言里加入对象序列化,是因为要用它来实现两个重要的功能:

    1.Java的远程方法调用能像调用自己机器上的对象那样去调用其它机器上的对象。

    2.对JavaBean来说,Bean的状态信息通常是在设计时配置的,这些状态信息必须保存起来,供程序启动的时候用,对象序列化就负责这个工作。

  对象序列化不仅能保存对象的副本,而且还会跟着对象中的reference把它所引用的对象也保存起来,然后再继续跟踪那些对象的reference。

2.实现序列化

  (1)序列化一个对象只要让它实现Serializable接口就行了(这是一个“标记接口”,tagging interface,没有任何方法)。

  (2)要想序列化对象,必须先创建一个OutputStream,然后把它嵌进ObjectOutputStream。这是就能用writeObject()方法把对象写入OutputStream。

  (3)读的时候需要把InputStream嵌到ObjectInputStream中,然后再调用readObject()方法。

3.样例

 package Entity;

 import java.io.Serializable;

 public class Employee implements Serializable{

     /*
* serialVersionUID作用:
* 序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
* 如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名),
* 当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。
* 但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,这个可以避开不兼容性的问题。
*/
private static final long serialVersionUID = -5167690587890199758L; public String name;
public String address;
public transient int SSN;
public int number;
public Department department; public String toString() {
return "Employee [name=" + name + ", address=" + address + ", number=" + number + "]";
} }

Employee.java

 package Entity;

 import java.io.Serializable;

 public class Department implements Serializable{
private static final long serialVersionUID = -6913084898834515327L; public int id;
public String name; public String toString() {
return "Department [id=" + id + ", name=" + name + "]";
} }

Department.java

 package Test;

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; import Entity.Department;
import Entity.Employee; public class test1 { /**
* 序列化对象
*/
@org.junit.Test
public void SerializeDemo() {
Employee e = new Employee();
e.name = "Reyan Ali";
e.address = "Phokka Kuan, Ambehta Peer";
e.SSN = 11122333;
e.number = 101;
Department d = new Department();
d.id = 1;
d.name = "Java研发";
e.department = d;
try {
System.out.println(e);
FileOutputStream fileOut = new FileOutputStream(new File("/Users/zhengbinMac/employee.txt"));
ObjectOutputStream out = new ObjectOutputStream(fileOut);
System.out.println(e);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in /Users/zhengbinMac/employee.txt");
} catch (IOException i) {
i.printStackTrace();
}
} /**
* 反序列化对象
*/
@org.junit.Test
public void DeserializeDemo() {
Employee e = null;
try {
FileInputStream fileIn = new FileInputStream("/Users/zhengbinMac/employee.txt");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
} catch (IOException i) {
i.printStackTrace();
return;
} catch (ClassNotFoundException c) {
System.out.println("Employee class not found");
c.printStackTrace();
return;
}
System.out.println("Deserialized Employee...");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
System.out.println("Department: " + e.department);
}
}

相关博文:

http://www.cnblogs.com/lanxuezaipiao/p/3369962.html

一天一个Java基础——序列化的更多相关文章

  1. Java基础-序列化

    Java序列化是将一个对象编码成一个字节流,反序列化将字节流编码转换成一个对象. 序列化是Java中实现持久化存储的一种方法: 为数据传输提供了线路级对象表示法. Java的序列化机制是通过在运行时判 ...

  2. 一天一个Java基础——泛型

    这学期的新课——设计模式,由我仰慕已久的老师传授,可惜思维过快,第一节就被老师挑中上去敲代码,自此在心里烙下了阴影,都是Java基础欠下的债 这学期的新课——算法设计与分析,虽老师不爱与同学互动式的讲 ...

  3. 每天进步一点点-实例为导学-一个java对象序列化的例子

    序列化和反序列化例子 如果我们想要序列化一个对象, (对象 转 序列)首先要创建某些OutputStream(如FileOutputStream.ByteArrayOutputStream等),然后将 ...

  4. Java基础—序列化与反序列化(转载)

    转载自: Java序列化与反序列化 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化 ...

  5. Java基础--序列化Serializable

    对Java对象序列化的目的是持久化对象或者为RMI(远程方法调用)传递参数和返回值. 下面是一个序列化对象写入文件的例子: ---------------------------- package u ...

  6. Java基础——序列化

    Java的“对象序列化”能将一个实现了Serialiable接口(标记接口,没有任何方法)的对象转化为一组byte,这样日后要用到这个对象的时候,就能把这些byte数据恢复出来,并据此重新构建那个对象 ...

  7. java基础---->序列化框架arvo的使用

    这里面我们介绍一下序列化框架arvo的使用,在kafka中使用的就是这个. arvo的使用 一.需要通过插件生成Model类方式 一.生成我们的数据模型User.java 我们在resources里面 ...

  8. java基础 序列化反序列化流 实现Serializable 接口 自动装载序列号到对象文本文件如修改不能反序列化对象文本,除非自定义long型常量 打印流

    package com.swift.baseKnowledge; import java.io.File; import java.io.FileInputStream; import java.io ...

  9. Java基础--序列化和反序列化

    作用:在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Sessi ...

随机推荐

  1. [设计模式] 11 享元模式 Flyweight

    转 http://blog.csdn.net/wuzhekai1985/article/details/6670298 问题 在面向对象系统的设计何实现中,创建对象是最为常见的操作.这里面就有一个问题 ...

  2. Ajax出入江湖

    window.onload = initAll; var xhr = false; function initAll() { if (window.XMLHttpRequest) { xhr = ne ...

  3. linux网络配置、环境变量以及JDK安装(CentOS 6.5)

    由于需要搭建hadoop平台,但是苦于没有现成可用的linux服务器,只好自己下载了CentOS 6.5从头装起,安装过程中遇到了很多问题,比如网络配置.时钟同步.环境变量配置.以及各种服务的启停,还 ...

  4. 核心思想:百度网盘怎么盈利(互联网的高速更新决定了:亏钱你还有点机会,放弃连门都进不了),战略预备队 good

    百度做网盘很大程度就是为了防止别人依靠网盘做大和积累点技术储备.腾讯邮箱怎么赚钱?腾讯影音怎么赚钱?互联网的高速更新决定了,一些你看不起眼的软件很可能就会席卷整个市场,所以互联网大佬宁愿一些项目亏钱也 ...

  5. Photoshop CS4序列号过期的问题

    1)在网络上搜寻一些PS CS4序列号: 如1330-1221-6824-4838-0308-6823,1330-1283-7461-4574-7002-2504,1330-1795-2880-537 ...

  6. NSArray 利用数组创建数组

    NSArray *array=[NSArray arrayWithObjects:@"1",@"2",@"3", nil];         ...

  7. EJB--事务管理 .

    在我们对事务的基本概念以及出现的问题和隔离级别有进一步的了解之后,接下来看看EJB是如何进行事务管理. 在EJB中有两种使用事务的方式.第一种方式通过容器管理的事务,叫CMT(Container-Ma ...

  8. android的jni

    一.底层实现: c文件:hardware/libhardware_legacy/power/power.c 以其中set_screen_state(int)函数为例 其Android.mk中添加:   ...

  9. 如何设计Java框架----一个简单的例子【翻译】

    原文:http://www.programcreek.com/2011/09/how-to-design-a-java-framework/ 原文和翻译都只是参考,如有不对,欢迎指正. 你可能会好奇框 ...

  10. !!流行的php面试题及答案

    分类: 1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(1)中:而链接到当前页面的URL记录在预定义变量(2)中. 答:echo $_SERVER['PHP_SELF']; ...