java 对象序列化

package org.rui.io.serializable;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Random; /**
* 对象 序列化
* 以下这些操作都使得事情变得更加复杂。加大了难度,然而。真正的序列化过程却是很easy的
* @author lenovo
*
*/ class Data implements Serializable
{
private int n;
public Data(int n){this.n=n;}
public String toString(){return Integer.toString(n);}
}
public class Worm implements Serializable {
private static Random rand=new Random(47);
private Data[]d={
new Data(rand.nextInt(10)),
new Data(rand.nextInt(10)),
new Data(rand.nextInt(10))
}; private Worm next;
private char c;
// value of i==number of segments
public Worm(int i,char x)
{
System.out.println("worm constructor;"+i);
c=x;
if(--i>0)
next=new Worm(i,(char)(x+1));
}
//
public Worm(){
System.out.println("defalult constructor");
} public String toString()
{
StringBuilder result=new StringBuilder();
result.append(c);
result.append("(");
for(Data data:d)
result.append(data);
result.append(")");
if(next!=null)
result.append(next);
return result.toString();
} ///////////////////////////////////////////
public static void main(String[] args) throws Exception {
Worm w=new Worm(6,'a');
System.out.println(" w:"+w);
//序列化到
ObjectOutputStream out=new ObjectOutputStream(
new FileOutputStream("worm.out")
);
out.writeObject("Worm storage\n");
out.writeObject(w);
out.close();
//读取
ObjectInputStream in=new ObjectInputStream(
new FileInputStream("worm.out")
);
String s=(String)in.readObject();
Worm worm=(Worm)in.readObject();
System.out.println("s:"+s+" w2:"+worm);
//////////////////////////////////////////////////////////
//再次写入
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos);
oos.writeObject("Worm storage\n");
oos.writeObject(w);
oos.flush(); //读取
ObjectInputStream in2=new ObjectInputStream(
new ByteArrayInputStream(bos.toByteArray())
);
s=(String)in2.readObject();
Worm w3=(Worm)in2.readObject();
System.out.println("s:"+s+" w3:"+w3);
} }
/**output:
worm constructor;6
worm constructor;5
worm constructor;4
worm constructor;3
worm constructor;2
worm constructor;1
w:a(853)b(119)c(802)d(788)e(199)f(881)
s:Worm storage
w2:a(853)b(119)c(802)d(788)e(199)f(881)
s:Worm storage
w3:a(853)b(119)c(802)d(788)e(199)f(881)
*/ /** doc
Java 1.1 增添了一种有趣的特性,名为“对象序列化”(Object Serialization)。 它面向那些实现了
Serializable 接口的对象,可将它们转换成一系列字节,并可在以后全然恢复回原来的样子。这一过程亦可
通过网络进行。这意味着序列化机制能自己主动补偿操作系统间的差异。换句话说。能够先在Windows 机器上创
建一个对象,对其序列化,然后通过网络发给一台Unix 机器,然后在那里准确无误地又一次“装配”。不必关
心数据在不同机器上怎样表示,也不必关心字节的顺序或者其它不论什么细节。
就其本身来说,对象的序列化是很有趣的。由于利用它能够实现“有限持久化”。请记住“持久化”意味
着对象的“生存时间”并不取决于程序是否正在运行——它存在或“生存”于程序的每一次调用之间。通过
序列化一个对象,将其写入磁盘,以后在程序又一次调用时又一次恢复那个对象,就能圆满实现一种“持久”效
果。之所以称其为“有限”,是由于不能用某种“persistent”(持久)keyword简单地地定义一个对象。并
让系统自己主动照看其它全部细节问题(虽然将来可能成为现实)。相反,必须在自己的程序中明白地序列化和
组装对象。 语言里添加了对象序列化的概念后,可提供对两种主要特性的支持。Java 1.1 的“远程方法调用”(RMI) 使本来存在于其它机器的对象能够表现出好象就在本地机器上的行为。将消息发给远程对象时,须要通过对
象序列化来传输參数和返回值。RMI 将在第15 章作详细讨论。
对象的序列化也是Java Beans 必需的,后者由Java 1.1 引入。使用一个Bean 时,它的状态信息通常在设计
期间配置好。程序启动以后,这样的状态信息必须保存下来,以便程序启动以后恢复;详细工作由对象序列化
完毕。
对象的序列化处理很easy,仅仅需对象实现了Serializable 接口就可以(该接口仅是一个标记,没有方法)。
在Java 1.1 中。很多标准库类都发生了改变,以便能够序列化——当中包括用于基本数据类型的全部封装
器、全部集合类以及其它很多东西。 甚至Class 对象也能够序列化(第11 章讲述了详细实现过程)。 为序列化一个对象,首先要创建某些OutputStream 对象。然后将其封装到ObjectOutputStream 对象内。此
时,仅仅需调用writeObject()就可以完毕对象的序列化,并将其发送给OutputStream。相反的过程是将一个
InputStream 封装到ObjectInputStream 内,然后调用readObject()。和往常一样,我们最后获得的是指向
一个上溯造型Object 的句柄。所以必须下溯造型。以便能够直接设置。
对象序列化特别“聪明”的一个地方是它不仅保存了对象的“全景图”,并且能追踪对象内包括的全部句柄
并保存那些对象。接着又能对每一个对象内包括的句柄进行追踪。以此类推。我们有时将这样的情况称为“对象
网”。单个对象可与之建立连接。并且它还包括了对象的句柄数组以及成员对象。若必须自行操纵一套对象
序列化机制,那么在代码里追踪全部这些链接时可能会显得很麻烦。在还有一方面,由于Java 对象的序列化
似乎找不出什么缺点,所以请尽量不要自己动手,让它用优化的算法自己主动维护整个对象网。 以下这个样例对
序列化机制进行了測试。它建立了很多链接对象的一个“Worm”(蠕虫),每一个对象都与Worm 中的下一段链
接,同一时候又与属于不同类(Data)的对象句柄数组链接: 更有趣的是,Worm 内的Data 对象数组是用随机数字初始化的(这样便不用怀疑编译器保留了某种原始信
息)。每一个Worm 段都用一个Char 标记。 这个Char 是在反复生成链接的Worm 列表时自己主动产生的。创建一个
Worm 时。需告诉构建器希望它有多长。 为产生下一个句柄(next),它总是用减去1 的长度来调用Worm 构
318
建器。最后一个next 句柄则保持为null(空),表示已抵达Worm 的尾部。
上面的全部操作都是为了加深事情的复杂程度。加大对象序列化的难度。然而,真正的序列化过程却是很
简单的。一旦从另外某个流里创建了ObjectOutputStream,writeObject()就会序列化对象。注意也能够为
一个String 调用writeObject()。亦可使用与DataOutputStream 同样的方法写入全部基本数据类型(它们
有同样的接口)。 有两个单独的try 块看起来是相似的。第一个读写的是文件,而还有一个读写的是一个ByteArray(字节数
组)。可利用对不论什么DataInputStream 或者DataOutputStream 的序列化来读写特定的对象;正如在关于连网
的那一章会讲到的那样,这些对象甚至包括网络 能够看出。装配回原状的对象确实包括了原来那个对象里包括的全部链接。
注意在对一个Serializable(可序列化)对象进行又一次装配的过程中,不会调用不论什么构建器(甚至默认构建
器)。 整个对象都是通过从InputStream 中取得数据恢复的。
作为Java 1.1 特性的一种,我们注意到对象的序列化并不属于新的Reader 和Writer 层次结构的一部分。而
是沿用老式的InputStream 和OutputStream 结构。所以在一些特殊的场合下,不得不混合使用两种类型的层
次结构。
*/

java 对象序列化的更多相关文章

  1. Java对象序列化剖析

    对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...

  2. 理解Java对象序列化

    http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html 1. 什么是Java对象序列化 Java平台允许我们在内存中创 ...

  3. java 对象序列化与反序列化

    Java序列化与反序列化是什么? 为什么需要序列化与反序列化? 如何实现Java序列化与反序列化? 本文围绕这些问题进行了探讨. 1.Java序列化与反序列化  Java序列化是指把Java对象转换为 ...

  4. 理解Java对象序列化(二)

    关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Th ...

  5. 关于 Java 对象序列化您不知道的 5 件事

    数年前,当和一个软件团队一起用 Java 语言编写一个应用程序时,我体会到比一般程序员多知道一点关于 Java 对象序列化的知识所带来的好处. 关于本系列 您觉得自己懂 Java 编程?事实上,大多数 ...

  6. java 对象序列化 RMI

    对于一个存在于Java虚拟机中的对象来说,其内部的状态只保持在内存中.JVM停止之后,这些状态就丢失了.在很多情况下,对象的内部状态是需要被持久化下来的.提到持久化,最直接的做法是保存到文件系统或是数 ...

  7. Java对象序列化入门

      Java对象序列化入门 关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制 ...

  8. Java对象序列化与反序列化一 JSON

    Java对象序列化与反序列化一 JSON 1. 依赖库 jackson-all-1.6.1.jar 2. 代码 public class Student {    private String nam ...

  9. Java对象序列化/反序列化的注意事项(转)

    Java对象序列化 对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中.JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了.而在很多情况下,对象内部状态是需要被持久 ...

随机推荐

  1. 《C++ primer》--第7章

    删除指针后,该指针就变成了悬垂指针.悬垂指针指向曾经存放对象的内存,但该对象已经不再存在了. 习题7.8 举一个例子说明什么时候应该将形参定义为引用类型.再举一个例子说明什么时候不应该将形参定义为引用 ...

  2. 【剑指offer 面试题7】用两个栈实现队列

    #include <iostream> #include <stack> using namespace std; template <typename T> cl ...

  3. Tableau学习笔记之三

    1.Tableau可以连接多种多样的数据以及数据库,例如txt,xls,mdb,sql server,oracle等等 2.Tableau还可以从剪贴板上粘贴数据 3.维度和度量的理解: 1)维度即表 ...

  4. net中前台javascript与后台c#函数相互调用

    问: 1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量? 3.如何在C#中访问JavaScript的已有变量? 4.如何在C#中访问JavaScript函数? ...

  5. OpenGL学习——基本概念和坐标变换

    基本概念 基本功能:几何图形.变换.着色.光照.贴图 高级功能:曲面图元.光栅操作.景深.shader编程   状态机 先设置状态参数:多边形.顶点列表.填充颜色.纹理.混合模式.坐标系 再调用绘图指 ...

  6. Web服务器(Apache)虚拟主机的配置

    一.定义    所谓虚拟主机是指在一台服务器里运行几个网站,提供WEB.FTP.Mail等服务.    二.虚拟主机的实现方法有三种:    基于IP的方法,基于主机名的方法和基于端口的法官法.    ...

  7. 微信公众平台开发 ACCESS TOKEN

    获取access token 返回 access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒,重复获取将 ...

  8. 关于OpenCV做图像处理内存释放的一些问题

    转载:http://blog.sina.com.cn/s/blog_67a7426a0101czyr.html 工程运行,发现内存持续增长,到一定的时候就发生了内存泄漏. 内存泄露的定义 内存泄露是说 ...

  9. hadoop测试环境主配置简例

    1,mapred-site.xml 此配置文件主要是针对mapreduce的配置文件,配置的是jobtracker的地址和端口; <configuration> <property& ...

  10. 第二百四十七天 how can I 坚持

    今天去了趟北海公园,看到地铁宣传图片挺好看的,实景也倒是不错,环境好了,哪都好,今天是蓝天白云啊. 回来的路上看了,扎克伯格对质疑的回应.哎.改变世界在硅谷是行动,而不是口号.change the w ...