Java 学习笔记:深入Serializable

Java的Serializable

Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。

说白了,Java都是通过对象来描述实体,而对象是不能再网络上传递的,如果将对象生成一种可以解析的"一连串的字节描述",那么对象的数据就可以在网络上进行传递了。

对象序列化后,会生成一个.out结尾的文件,这个文件用16进制打开就像下面的一样:

[java]
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接口,例如以下代码:

[java]
/**
* guest_book 数据结构
* @author zhuli.zhul
*/
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,就是一个序列化的对象的数据流文件,就能将对象写入数据流了。

[java]
@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";
}

Java 学习笔记:深入Serializable

我们可以通过读取temps.out的方法就能读取到这个数据流中的对象结构。

[java]
@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 学习笔记:深入Serializable

序列化算法一般会按步骤:

将对象实例相关的类元数据输出。
递归地输出类的超类描述直到不再有超类。
类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值。
从上至下递归输出实例的数据

分类:默认分类 时间:2012-01-07 人气:5
本文关键词:
分享到:

相关文章

  • JAVA程序求职必看-125条常见的java面试笔试题汇总 2012-01-01

    1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,

  • Java基础使用技巧:深拷贝的两种方式 2012-06-22

      ⑴浅复制(浅克隆)   被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。   ⑵深复制(深克隆)   被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。   Java的clone()方法   ⑴clone方法将对象复制了一份并返回给调

  • Java对象序列化使用基础 2012-11-27

      序列化的过程就是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机。对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义。   1.对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。   2.Jav

  • java对象序列化学习笔记 2013-11-11

    目前网络上关于对象序列化的文章不少,但是我发现详细叙述用法和原理的文章太少。本人把自己经过经验总结和实际运用中的体会写成的学习笔记贡献给大家。希望能为整个java社区的繁荣做一点事情。 序列化的过程就是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机。对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网络编程中并不是最激动人心的

  • Java深度历险:Java对象序列化与RMI 2014-05-02

     对于一个存在于Java虚拟机中的对象来说,其内部的状态只保持在内存中。JVM停止之后,这些状态就丢失了。在很多情况下,对象的内部状态是需要被持久化下来的。提到持久化,最直接的做法是保存到文件系统或是数据库之中。这种做法一般涉及到自定义存储格式以及繁琐的数据转换。对象关系映射(Object-relational mapping)是一种典型的用关系数据库来持久化对象的方式,也存在很多直接存储对象的对象数据库。对象序列化机制(object serialization)是Java语言内建的一种对象持久

  • Java性能优化系列之五--JavaIO 2014-09-05

    1、关于Java序列化与反序列化: (1)作用: 1、实现对象状态的保存到本地,以便下一次启动虚拟机的时候直接读取保存的序列化字节生成对象,而不是初始化对象;2、实现对象的网络传输(RMI分布对象);3、实现对象的深拷贝。 一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。 二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。

  • 享元模式-AbstractMap结构 2012-07-18

    享元模式: 共享数据的模式。 例子:创建定制的Map-->FlyweightMap. 1. 默认填充DATA元数据,避免每次使用FlyweightMap时创建新的数据。 2. Map的数据结构 package designpattern.flyweight; import java.util.AbstractMap; import java.util.AbstractSet; import java.util.ArrayList; import java.util.HashMap; imp

  • Hibernate以组件作为复合主键实例详解 2013-08-16

    本文章来给各位同学介绍一个关于Hibernate以组件作为复合主键实例详解,希望此教程对各位同学会有所帮助哦。 有时候我的表中需要多个主键的时候,这个时候我们就需要使用组件来做为表的主键。 1.我们需要一份hibernate.cfg.xml的配置文件 2.我们需要一个用来持久化的类,我这里例子用的是 Member.java 3.需要一个组件类, 我这里的例子用的是 Name.java 4.需要为持久化类配置一个映射的规则文件。 Member.cfg.xml 5.用来将持久化类插入数据库的操纵类,

  • java之jvm学习笔记(策略和保护域) 2012-01-02

    前面一节,我们做了一个简单的实验,来说明什么是策略文件,在文章的最后,也顺带的讲了一下什么是策略,还有策略的作用。 为了引出另外一个很重要的概念ProtectionDomain(保护域),所以我们还是要先来回顾一下什么是策略。 首先,什么是策略,今天的东西纯粹是比较概念的。当然,如果你读过笔记九,今天的东西,就真的是soso 策略与策略文件: java对应用程序的访问控制策略是由抽象类java.security.Policy的一个子类的单例所表示,任何时候,每个应用程序实际上只有一个Policy

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.060 (s). 10 q(s)