java.io.Serializable接口实现序列化

来源:互联网 发布:php自动发卡平台 编辑:程序博客网 时间:2024/05/16 14:51

     今天用套接字在网络上传送对象时写了一个类文件User用来封装各个数据,用这个类继承了Serializable接口,一开始不清楚这个接口是干嘛用的,直到后来编写的程序运行时报错才开始注意到这个接口,因为程序分为客户端和服务器端,然后两个程序中都有个User类,只是包名不同,于是运行时就一直报出了找不到类方法的错误,纠结了好久,经人指点把包名改成相同的就不会报错了。

类通过实现java.io.Serializable接口实现序列化和反序列化功能,并且可序列化的所有子类都是可序列化的,java的“对象序列化”能将实现了此接口的对象转换为byte流,使用的时候能把这些byte数据恢复出来,并据此重构那个对象了。

具体实现方法:

要想序列化对象,你必须先创建一个OutputStream,然后把它嵌入ObjectOutputStream。此时,你就能用writeObject()方法把对象写入OutputStream了。

writeObject()方法负责写入特定类的对象的状态,以便相应的 readObject()方法可以还原它。读的时候,你得把InputStream嵌到ObjectInputStream里面,然后再调用readObject()方法。不过这样读出来的,只是一个Object的reference,因此在用之前,还得先下转。


下面就以我程序中套接字通信的片段例子来说明:



这是客户端的程序片段,通过与服务器连接创建的socket s来过去对服务器写数据的输出流,嵌入到ObjectOutputStream中。然后发送给服务器。

<strong><span style="font-size:18px;">//向服务器写数据ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());//将获取到的数据包发给服务器oos.writeObject(obj);//其中obj是从LoginActivity中传过来的user数据</span></strong>


这是服务器端的程序片段,通过s套接字的getInputStream来获取输入流,然后将这个InputStream嵌入到ObjectInputStream里面,然后通过readObject还原它,利用强制转换下转到User类。

ObjectInputStream ois=new ObjectInputStream(s.getInputStream());//获得输入流,s是socket套接字User u=(User)ois.readObject();//读取输入流的信息


在序列化时,有几点要注意的:
  1:当一个对象被序列化时,只保存对象的非静态成员变量(包括声明为private的变量),不能保存任何的成员方法和静态的成员变量。
  2:如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被序列化。
  3:如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列化。

1.序列化是干什么的?
  
简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。

  2.什么情况下需要序列化
  a)当你想把的内存中的对象保存到一个文件中或者数据库中时候;
  b)当你想用套接字在网络上传送对象的时候;
  c)当你想通过RMI传输对象的时候;

3.当对一个对象实现序列化时,值都被保存在一个文件中,然后用的时候再从文件中读出来,重新在堆中创建原来的对象。当然保存的时候不仅仅是保存对象的实例变量的值,JVM还要保存一些小量消息,比如类的类型等以便恢复原来的对象。

0 0
原创粉丝点击