免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10839 | 回复: 7
打印 上一主题 下一主题

新手问:java中的Serializable接口到底是做什么用的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-08-27 15:24 |只看该作者 |倒序浏览
我看了JAVADOCS里的Serializable的文档,没看明白是怎么回事啊。由于初学,没有找到相应的例子看看是怎么用的。

请各位老大指点:
1。能详细讲解一下序列化的概念和这个接口一般在什么情况下使用。

2。能给一个非常简单但能充分展现Serializable的本质的程序。

先谢谢。

论坛徽章:
0
2 [报告]
发表于 2004-08-28 12:34 |只看该作者

新手问:java中的Serializable接口到底是做什么用的?

序列化是把一个对象的状态写入一个字节流的过程,它执行RMI,RMI允许一台机器上的JAVA对象调用不同机器上的JAVA对象方法,对象可以作为参数提供给那个远程方法,发送机序列化该对象并传送它,接收机执行反序列化。
序列化和反序列化的关系图表可形成包含循环引用的顺序图表。这是整个序列化的总体思想。
而Serializable接口属于支持序列化的一个接口,只有一个实现它的对象可以被序列化工具存储和回复,Serializable接口没有定义任何成员,只用来表示一个累可以被序列化,若该类可以序列化,那么它的所有子类都可以。
下面是关于序列化的一个实例:
程序名称:SerializationDemo.java
程序主题:实现对象的序列化和反序列化
程序说明:该程序由实例化一个MyClass类的对象开始,该对象有三个实例变量,类型分别为String、int、double,是希望存储和恢复的信息。




  1. import java.io.*;

  2. public class SerializationDemo{
  3.         public static void main(String args[]){

  4. //Object serialization
  5. try{
  6.         MyClass object1=new MyClass("Hello",-7,2.7e10);
  7.         System.out.println("object1:"+object1);
  8.         FileOutputStream fos=new FileOutputStream("serial");
  9.         ObjectOutputStream oos=new ObjectOutputStream(fos);
  10.         oos.writeObject(object1);
  11.         oos.flush();
  12.         oos.close();
  13.         }
  14. catch(Exception e){
  15.         System.out.println("Exception during serialization:"+e);
  16.         System.exit(0);
  17.         }

  18. //Object deserialization
  19. try{
  20.         MyClass object2;
  21.         FileInputStream fis=new FileInputStream("serial");
  22.         ObjectInputStream ois=new ObjectInputStream(fis);
  23.         object2=(MyClass)ois.readObject();
  24.         ois.close();
  25.         System.out.println("object2:"+object2);
  26.         }
  27. catch(Exception e){
  28.         System.out.println("Exception during deserialization:"+e);
  29.         System.exit(0);
  30.         }
  31. }
  32. }

  33. class MyClass implements Serializable{
  34.         String s;
  35.         int i;
  36.         double d;
  37.         public MyClass(String s,int i,double d){
  38.                 this.s=s;
  39.                 this.i=i;
  40.                 this.d=d;
  41.         }
  42.         public String toString(){
  43.                 return "s="+s+";i="+i+";d="+d;
  44.         }
  45. }
复制代码


程序运行结果:object1和object2的实例变量是一样的,输出如下:
  1. object1:s=Hello;i=-7;d=2.7E10
  2. object2:s=Hello;i=-7;d=2.7E10
复制代码

论坛徽章:
0
3 [报告]
发表于 2004-08-30 09:57 |只看该作者

新手问:java中的Serializable接口到底是做什么用的?

hehe
未必是RMI啦
持久化也是Serializable的重点...

论坛徽章:
0
4 [报告]
发表于 2004-08-30 16:17 |只看该作者

新手问:java中的Serializable接口到底是做什么用的?

//agree
持久化是Serializable开始的目的。
楼主有什么心得,是不是也response一下?

论坛徽章:
0
5 [报告]
发表于 2004-09-03 16:01 |只看该作者

新手问:java中的Serializable接口到底是做什么用的?

现在知道是怎么回事了-----Thank Bruce Eckel a million times for his excellent <<Think in java(Second Edition) >;>;.书里面讲的好清楚啊。

一。猫小写的不大全,可能是因为我的帖子里写的“一般在什么情况下用”这话作怪。

我补充一下:

Object serialization的定义:
Object serialization 允许你将实现了Serializable接口的对象转换为字节序列,这些字节序列可以被完全存储以备以后重新生成原来的对象。

serialization不但可以在本机做,而且可以经由网络操作(就是猫小说的RMI)。这个好处是很大的----因为它自动屏蔽了操作系统的差异,字节顺序(用Unix下的c开发过网络编程的人应该知道这个概念,我就容易在这上面犯错)等。比如,在Window平台生成一个对象并序列化之,然后通过网络传到一台Unix机器上,然后可以在这台Unix机器上正确地重构这个对象。


Object serialization主要用来支持2种主要的特性:
1。Java的RMI(remote method invocation).RMI允许象在本机上一样操作远程机器上的对象。当发送消息给远程对象时,就需要用到serializaiton机制来发送参数和接收返回直。

2。Java的JavaBeans.   Bean的状态信息通常是在设计时配置的。Bean的状态信息必须被存起来,以便当程序运行时能恢复这些状态信息。这也需要serializaiton机制。



二。sakulagi和rollingpig说的持久化我也说一下。
我觉得你们说的应该是英文里的persistence.但是Java语言里现在只支持lightweight persistence,就是轻量级持久化,这是通过serialization机制来实现的。

persistence是指一个对象的生命周期不由程序是否执行来决定,即使是在程序终止时这个对象也存在。它把一个serializable的对象写到磁盘(本机或其他机器上的非RAM存储器),并在程序重新调用时再读取对象到通常的RAM存储器。

为什么说Java的serialization机制实现的是lightweight persistence?因为你必须显式的序列化和反序列化程序里的对象;而不是直接由一个关键词来定义一个对象是序列化的然后由系统做相应的处理。  如果以后的Java版本出现一个新的关键字来实现这种机制,比如就是persistence,如果我用

persistence  (String s="chinaunix"

然后系统自动做猫小程序里的那些处理,那么Java就实现了persistence.


第一次写这么多,而且是刚看了书不久写的,错误和行文不当之处多包涵。

再次感谢猫小,sakulagi和rollingpig给的提示。

论坛徽章:
0
6 [报告]
发表于 2004-09-04 14:49 |只看该作者

新手问:java中的Serializable接口到底是做什么用的?

Joshua Bloch 的 "Effective Java Programming Language Guide" 里面关于 Serializable 的部分讲得也很好,尤其是什么时候该用,什么时候不该用。

论坛徽章:
0
7 [报告]
发表于 2004-09-04 17:46 |只看该作者

新手问:java中的Serializable接口到底是做什么用的?

up

关于序列化处理Bean的状态信息能不能说的详细具体一些呢,谢谢!

论坛徽章:
0
8 [报告]
发表于 2004-11-23 10:55 |只看该作者

新手问:java中的Serializable接口到底是做什么用的?

这儿我没有写过,我想是通过序列化bean,进行writeObject方法可以将数据写入数据库的一个表。
oracle对这点有支持。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP