A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘洋 黑马帝   /  2011-10-8 10:46  /  3736 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

想知道都有什么类使用了序列化接口,起到什么作用?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

11 个回复

倒序浏览
序列化是把一个对象的状态写入一个字节流的过程,它执行RMI,RMI允许一台机器上的JAVA对象调用不同机器上的JAVA对象方法,对象可以作为参数提供给那个远程方法,发送机序列化该对象并传送它,接收机执行反序列化。
序列化和反序列化的关系图表可形成包含循环引用的顺序图表。这是整个序列化的总体思想。
而Serializable接口属于支持序列化的一个接口,只有一个实现它的对象可以被序列化工具存储和回复,Serializable接口没有定义任何成员,只用来表示一个累可以被序列化,若该类可以序列化,那么它的所有子类都可以。

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题有分! 继续努力..

查看全部评分

回复 使用道具 举报
就是Serializable这个类啊
序列化接口在网络传输的时候就相当于把数据按照一定的顺序格式排列,这样就可以在跨平台中使用。
该类是JAVA提供通用数据保存和读取的接口,如果你想把一个对象保存到文件中就必须要实现序列化接口

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题有分! 继续努力..

查看全部评分

回复 使用道具 举报
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。序列化接口Serializable没有方法或字段,仅用于标识可序列化的语义


  实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回原来的样子。这一过程亦可通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异。换句话说,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新“装配”。不必关心数据在不同机器上如何表示,也不必关心字节的顺序或者其他任何细节。


  serialization主要用来支持2种主要的特性:
  1、RMI(Remote method invocation)。RMI允许象在本机上一样操作远程机器上的对象。当发送消息给远程对象和调用远程方法时,就需要用到serializaiton机制来发送参数和接收返回值。  
  2、保存信息。在某个时候把状态信息保存起来,以便以后某个时候能恢复这些状态信息。
  Hibernaet和EJB中的实体Bean就用到了上面两个特性。


  另外:保存的时候不仅能保存对象的副本,而且还会把对象里面所引用的对象也保存起来,以此类推。就像在编译某个类一样,会涉及到所用到的所有类。但是所引用的对象也必须是可序列化的,不然会抛NotSerializableException异常。
回复 使用道具 举报

实现java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。
  序列化类的所有子类本身都是可序列化的。这个序列化接口没有任何方法和域,仅用于标识序列化的语意。允许非序列化类的子类型序列化,子类型可以假定负责保存和恢复父类型的公有的、保护的和(如果可访问)包的域的状态。只要该类(扩展)有一个无参构造子,可初始化它的状态,那么子类型就可承担上述职责。在这种情况下申明一个可序列化的类是一个错误。此错误将在运行时被检测。就是可以把对象存到字节流,然后可以恢复!
  例如:Integer实现了Serializable,所以可以把一个Integer的对象用IO写到文件里,之后再可以从文件里读出,如你开始写入的时候那个对象的intValue() 是5的话,那读出来之后也是5。这一点体现了用序化类的作用,即用来传送类的对象。
  所谓的Serializable,就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了。这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。只要设计一个保存一个读取功能就能解决上面说得所有问题。
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?因为你必须显式的序列化和反序列化程序里的对象;而不是直接由一个关键词来定义一个对象是序列化的然后由系统做相应的处理。


下面是关于序列化的一个实例:

程序名称:SerializationDemo.java
程序主题:实现对象的序列化和反序列化
程序说明:该程序由实例化一个MyClass类的对象开始,该对象有三个实例变量,类型分别为String、int、double,是希望存储和恢复的信息。

代码内容

import java.io.*;




public class SerializationDemo{


          public static void main(String args[]){




//Object serialization


try{


MyClass object1=new MyClass("Hello",-7,2.7e10);


System.out.println("object1:"+object1);


FileOutputStream fos=new FileOutputStream("serial");


ObjectOutputStream oos=new ObjectOutputStream(fos);


oos.writeObject(object1);


oos.flush();


oos.close();


}


catch(Exception e){


System.out.println("Exception during serialization:"+e);


System.exit(0);


}




//Object deserialization


try{


MyClass object2;


FileInputStream fis=new FileInputStream("serial");


ObjectInputStream ois=new ObjectInputStream(fis);


object2=(MyClass)ois.readObject();


ois.close();


System.out.println("object2:"+object2);


}


catch(Exception e){


System.out.println("Exception during deserialization:"+e);


System.exit(0);


}


}


}




class MyClass implements Serializable{


String s;


int i;


double d;


public MyClass(String s,int i,double d){


    this.s=s;


    this.i=i;


    this.d=d;


}


public String toString(){


    return "s="+s+";i="+i+";d="+d;


}


}




程序运行结果:object1和object2的实例变量是一样的,输出如下:
object1:s=Hello;i=-7;d=2.7E10
object2:s=Hello;i=-7;d=2.7E10
回复 使用道具 举报
这样 应该差不多 了解了吧 ,有点多了  呵呵
Serializable   在实际应用用处?

网络传输数据,文件存盘读取时会用到的

对象序列化接口,远程传输对象,或以文件行式进行保存。
串行化后在网络传输,就像你读/写一个文件流一样。
序列化,,可以将一个对象以字节的形式存储在磁盘中或者在网络上传输,当从磁盘或网络中得到数据时可以恢复成原来的对象。
在分布式计算中的应用很大,尤其是RPC(在JAVA中多是RMI)
它只是一个标志!!   ,表示实现其接口的类的实例可以序列化.
序列化   用在   对象编码成字节流及从字节流编码重构对象。   
  序列化   为远程通信提供了标准的wire-level协议。   
  要使类的实例实现序列化,只要在它的声明中加入implements      
  java.io.Serializable   
  但是却由一些隐患   
  1   实现了序列化后,一旦发布,讲削弱改变类实现的灵活性。   
  2   增加了bug和安全漏洞的的可能性   
  3   当你的新版本发布时增加了相关的测试上的问题。      
  类应尽可能少的实现Serializable,接口也应该少去扩展它。   

如果您问的是这个接口java.io.Serializable的用处,而不是串行化本身的用处的话,请继续读:   
  java.io.Serializable是一个空接口,也就是说这个接口没有声明任何的方法,所以实现这个接口的类也就不需要实现任何的方法。   
  那么这个接口还有什么用处呢?     
  这个接口使得所有的实现它的类具有一个特殊的(mixin)类型,从而使JVM知道这个类可以安全地串行化。  


Class类实现Serializable接口的原因

Serializable这个接口只是一个标识接口,没有任何方法,主要是用于实例的序列化。只要有类实现了这个接口,就等于告诉jvm这个实例可以被序列化,只是起到一个标识的作用。在分布式系统中基本被要求实现这个接口。

可以作为流传输,还可以把对象保存到本地持久化。

1:   实现了   java.io.Serializable   接口的话   ,   JVM   才认为你确实需要   把这个类的对象的状态保存在什么地方以便以后恢复,   如果没有实现这个接口,   JVM   安全性认为这可不应该保存状态。   
  2:   对于实现了   Serializable   接口的,   如果它提供了   readObject(ObjectInputStream)   /   writeObject(ObjectOutputStream)   方法的话,   JVM   使用这对方法,如果没有提供的话,JVM   使用默认的方式来   保存/恢复   对象

评分

参与人数 1技术分 +3 黑马币 +4 收起 理由
admin + 3 + 4 赞一个!

查看全部评分

回复 使用道具 举报
Serializable只是为了标注该对象是可被序列化的。
序列化:将java对象存储到硬盘,jre本身就提供了这种支持,可以调用OutputStream的writeObject方法来做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。
类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。
也就是说没有实现这Serializable接口的类不可以被序列化。具体那些类,可以查阅文档,写的很明白。

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题有分! 继续努力..

查看全部评分

回复 使用道具 举报
刘朋朋 黑马帝 2011-10-8 12:47:03
8#
JAVA最酷的特性,可以把本地的某个对象“压扁”,然后发到一个流对象中,(如一个文件,或一个网络端口),然后在另一个JVM中把它“膨胀”为原来的对象,因为JAVA的平台无关性,使得对象可以在很广的范围内传递。

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题有分! 继续努力..

查看全部评分

回复 使用道具 举报
刘洋 黑马帝 2011-10-8 15:55:18
9#
谢谢大家,讲得很透彻
回复 使用道具 举报
张雷 发表于 2011-10-8 11:59
实现java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任一状态被序列化或逆 ...

你是牛人啊!搞这么多!很具体。。。。
回复 使用道具 举报
成杰 黑马帝 2011-10-8 19:54:45
11#
序列化,将java对象写入磁盘!
回复 使用道具 举报
简单说java.io.Serializable 接口就是把实现他的类的对象进行序列化,序列化就是把对象转成二进制数据,这样就可以使用ObjetOutputStream把这个对象存储到硬盘上,保证了对象的生命被延长。当你要把一个对象存储到文件中时你就可以使用java.io.Serializable 接口

评分

参与人数 1技术分 +1 收起 理由
admin + 1 答题有分! 继续努力..

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马