一天一个Java基础——序列化

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.样例

 1 package Entity;
 2
 3 import java.io.Serializable;
 4
 5 public class Employee implements Serializable{
 6
 7     /*
 8      * serialVersionUID作用:
 9      *        序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
10      *        如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名),
11      *            当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。
12      *        但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,这个可以避开不兼容性的问题。
13      */
14     private static final long serialVersionUID = -5167690587890199758L;
15
16     public String name;
17     public String address;
18     public transient int SSN;
19     public int number;
20     public Department department;
21
22     public String toString() {
23         return "Employee [name=" + name + ", address=" + address + ", number=" + number + "]";
24     }
25
26 }

Employee.java

 1 package Entity;
 2
 3 import java.io.Serializable;
 4
 5 public class Department implements Serializable{
 6     private static final long serialVersionUID = -6913084898834515327L;
 7
 8     public int id;
 9     public String name;
10
11     public String toString() {
12         return "Department [id=" + id + ", name=" + name + "]";
13     }
14
15 }

Department.java

 1 package Test;
 2
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileOutputStream;
 6 import java.io.IOException;
 7 import java.io.ObjectInputStream;
 8 import java.io.ObjectOutputStream;
 9
10 import Entity.Department;
11 import Entity.Employee;
12
13 public class test1 {
14
15     /**
16      * 序列化对象
17      */
18     @org.junit.Test
19     public void SerializeDemo() {
20         Employee e = new Employee();
21         e.name = "Reyan Ali";
22         e.address = "Phokka Kuan, Ambehta Peer";
23         e.SSN = 11122333;
24         e.number = 101;
25         Department d = new Department();
26         d.id = 1;
27         d.name = "Java研发";
28         e.department = d;
29         try {
30             System.out.println(e);
31             FileOutputStream fileOut = new FileOutputStream(new File("/Users/zhengbinMac/employee.txt"));
32             ObjectOutputStream out = new ObjectOutputStream(fileOut);
33             System.out.println(e);
34             out.writeObject(e);
35             out.close();
36             fileOut.close();
37             System.out.printf("Serialized data is saved in /Users/zhengbinMac/employee.txt");
38         } catch (IOException i) {
39             i.printStackTrace();
40         }
41     }
42
43     /**
44      * 反序列化对象
45      */
46     @org.junit.Test
47     public void DeserializeDemo() {
48         Employee e = null;
49         try {
50             FileInputStream fileIn = new FileInputStream("/Users/zhengbinMac/employee.txt");
51             ObjectInputStream in = new ObjectInputStream(fileIn);
52             e = (Employee) in.readObject();
53             in.close();
54             fileIn.close();
55         } catch (IOException i) {
56             i.printStackTrace();
57             return;
58         } catch (ClassNotFoundException c) {
59             System.out.println("Employee class not found");
60             c.printStackTrace();
61             return;
62         }
63         System.out.println("Deserialized Employee...");
64         System.out.println("Name: " + e.name);
65         System.out.println("Address: " + e.address);
66         System.out.println("SSN: " + e.SSN);
67         System.out.println("Number: " + e.number);
68         System.out.println("Department: " + e.department);
69     }
70 }
时间: 2024-10-25 17:24:57

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

一个Java基础练习

com聚合是包容的一种特例,目的是最大化的实现功能模块话,降低组件间的耦合性. 第一步: 通过ATL创建com外部组件TestOutCom.dll,在其内部创建接口包装类CCMyOuterCom,并实现其对应的接口ICMyOuterCom,注意默认选择"聚合"(这点很重要,后面我们会详细解说) 在"聚合"选项中: 勾选"是",则按照默认生成支持聚合的包装类 勾选"否",则包装类头文件CMyOuterCom.h,在公开接口列表字

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

序列化和反序列化例子 如果我们想要序列化一个对象, (对象 转 序列)首先要创建某些OutputStream(如FileOutputStream.ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中.这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节(1字节8位)的,不能使用Reader和Writer等基于字符的层次结构).而反序列的过

一天一个Java基础——泛型

这学期的新课——设计模式,由我仰慕已久的老师传授,可惜思维过快,第一节就被老师挑中上去敲代码,自此在心里烙下了阴影,都是Java基础欠下的债 这学期的新课——算法设计与分析,虽老师不爱与同学互动式的讲课,但老师讲的挺好,不过由于数据结构欠缺课听的有点烧脑,都是数据结构欠下的债 这学期的新课——英语口语,虽外教老师风骚逗趣浪荡不羁爱自由,但我辈词汇量欠缺,表明淡定说yeah,但心中一万匹草泥马策马奔腾,都是英语欠下的债 1.泛型类 实体类(容器类),经常重用的类,下面是一个没有用泛型的实体类: 1

Java基础——序列化

Java的“对象序列化”能将一个实现了Serialiable接口(标记接口,没有任何方法)的对象转化为一组byte,这样日后要用到这个对象的时候,就能把这些byte数据恢复出来,并据此重新构建那个对象.这一点在跨网络的环境下也是如此,这就意味着序列化机制能自动补偿操作系统方面的差异.也就是说,可以在Windows机器上创建一个对象,序列化之后,再通过网络传到UNIX机器上,最后再那里重建该对象,不用担心在不同平台上数据是怎么表示的,以及byte顺序怎么样,或者 别的什么细节. 要想序列化对象,必

java基础 序列化

参考文档:序列化与反序列化:http://kb.cnblogs.com/page/515982/jdk中的序列化api:http://blog.csdn.net/abc6368765/article/details/51365838jdk中如何序列化:http://www.cnblogs.com/redcreen/articles/1955307.html 什么是序列化&为什么要序列化序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当

一天一个Java基础——数组

一天一个变成了几天一个,最近接受的新东西太多.太快,有好多需要blog的但没有时间,这些基础知识应该是要深挖并好好研究的,不应该每次都草草了事,只看个皮毛. 数组: JVM将数组存储在一个称为堆(heap)的内存区域中,堆用于动态内存分配,在堆中内存块可以按随意的顺序分配和释放 1.int[] a; ——表示声明一个数组(也可写为 int a[];) 声明一个数组变量时并不在内存中给数组分配任何空间,只是创建一个对数组的引用的存储位置 如果变量不包含对数组的引用,那么这个变量的值为null 通过

一天一个Java基础——对象和类

1.在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象 2.可以在类中设置两种类型的元素:字段(也被称作数据成员)和方法(也被称作成员函数) 3.字段可以是任何类型的对象,可以通过其引用与其进行通信:也可以是基本类型中的一种.如果字段是对某个对象的引用,那么必须初始化该引用,以便使其与一个实际的对象向关联(使用new来实现) 4.可以把两个类放在同一个文件中,但是文件中只能有一个类是公共的.此外,公共类必须与文件同名 1.1 构造方法构造对象 构造方法是一种特殊的方

一天一个Java基础——反射

1.概念 反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力 Java中的反射是一种强大的工具,它能够创建灵活的代码,这些代码可以运行时装配,无须在组件之间进行链接 反射允许在编写与执行时,使程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码 如果使用不当,反射的成本会很高 2.例子 1 package Test; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.F

一天一个Java基础——通过异常处理错误

<Thinking in Java>上对这章的讲解不少,可见重要性,学习和总结一些主要的记录下来. 一.创建自定义异常 1 package Exception; 2 3 class SimpleException extends Exception{} 4 5 public class InheritingException{ 6 7 public void f() throws SimpleException { 8 System.out.println("Throw Simple