Java 学习笔记19:深入Serializable
2012-12-10 14:49
429 查看
Java的Serializable
Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。
说白了,Java都是通过对象来描述实体,而对象是不能再网络上传递的,如果将对象生成一种可以解析的"一连串的字节描述",那么对象的数据就可以在网络上进行传递了。
对象序列化后,会生成一个.out结尾的文件,这个文件用16进制打开就像下面的一样:
一个Java的Serializable实例:
Java的对象需要序列化,数据结构对象就需要实现Serializable接口,例如以下代码:
我们通过数据流的方式,将GuestbookDo对象进行序列化,写进数据流。并且在web目录下会生成temps.out,就是一个序列化的对象的数据流文件。通过url中的http://xxxx/test/test/访问,就能将对象写入数据流了。
我们可以通过读取temps.out的方法就能读取到这个数据流中的对象结构。
结果:
序列化算法一般会按步骤:
将对象实例相关的类元数据输出。
递归地输出类的超类描述直到不再有超类。
类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。
从上至下递归输出实例的数据
Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。
说白了,Java都是通过对象来描述实体,而对象是不能再网络上传递的,如果将对象生成一种可以解析的"一连串的字节描述",那么对象的数据就可以在网络上进行传递了。
对象序列化后,会生成一个.out结尾的文件,这个文件用16进制打开就像下面的一样:
AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65 73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05 63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78 70 00 64
一个Java的Serializable实例:
Java的对象需要序列化,数据结构对象就需要实现Serializable接口,例如以下代码:
/** * guest_book 数据结构 * @author zhuli */ public class GuestbookDo implements Serializable{ //implements Serializable是关键 private String title; private String content; private String username; private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getDtime() { return dtime; } public void setDtime(int dtime) { this.dtime = dtime; } private int dtime; }
我们通过数据流的方式,将GuestbookDo对象进行序列化,写进数据流。并且在web目录下会生成temps.out,就是一个序列化的对象的数据流文件。通过url中的http://xxxx/test/test/访问,就能将对象写入数据流了。
@RequestMapping(value="/test") @ResponseBody public String test() throws IOException { //对象实例化 GuestbookDo gb = new GuestbookDo(); gb.setContent("asdasd"); gb.setId(100); //数据流 FileOutputStream fos = new FileOutputStream("temps.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(gb); oos.flush(); oos.close(); return "test"; }
我们可以通过读取temps.out的方法就能读取到这个数据流中的对象结构。
@RequestMapping(value="/testa") @ResponseBody public String testa() throws Exception { InputStream is=new FileInputStream("temps.out"); ObjectInputStream ois=new ObjectInputStream(is); GuestbookDo gb = (GuestbookDo) ois.readObject(); System.out.println("id="+gb.getId()); System.out.println("content="+gb.getContent()); ois.close(); return "test1"; }
结果:
序列化算法一般会按步骤:
将对象实例相关的类元数据输出。
递归地输出类的超类描述直到不再有超类。
类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。
从上至下递归输出实例的数据
相关文章推荐
- Java与Flex学习笔记(19)----Flex中的Session管理
- (19)Java学习笔记——多线程02
- Java学习笔记(19)--关键字static详解
- 你不知道的Java学习笔记19-- 对象序列化
- 【Java】深入理解JVM学习笔记(三) —— GC收集器和内存分配
- 黑马程序员—19—java基础:有关File类的学习笔记和学习心得体会
- 【Java学习笔记之二十八】深入了解Java8新特性
- 深入Java虚拟机JVM类加载初始化学习笔记
- UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习
- 【深入理解Java虚拟机学习笔记】虚拟机类加载机制
- Java 学习笔记30:gson的深入使用
- UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习
- JAVA学习笔记:(一)深入探究枚举类型
- java学习笔记(十二)——容器深入
- Java学习笔记之深入理解关键字static
- Java学习笔记[深入引用传递] 2010-8-22
- java个人学习笔记19(多生产者多消费者+循环判断标记+notifyAll()+Lock+Condition)
- 深入Java虚拟机学习笔记 - 垃圾收集器
- JVM深入学习笔记二:Java JIT编译
- Java学习笔记之深入理解关键字null