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还要保存一些小量消息,比如类的类型等以便恢复原来的对象。
- java.io.Serializable接口实现序列化
- java.io.Serializable (序列化接口)
- java序列化1[实现Serializable接口]
- Java序列化(实现Serializable接口)作用
- 【JAVA】通过实现java.io.Serializable接口启用类的序列化
- java.io.Serializable序列化接口类及编码表
- 序列化:java.io.Serializable
- java.io.Serializable序列化
- 序列化:java.io.Serializable
- 序列化:java.io.Serializable
- 序列化java.io.Serializable
- 序列化:java.io.Serializable
- java.io.Serializable序列化
- java.io.Serializable 序列化
- 实现serializable序列化接口
- Java中对象的序列化(实现java.io.Serializable)
- java 序列化 Serializable接口
- java序列化Serializable接口
- VS2013里面新建项目未找到Windows Phone选项
- 计算机系统:深入理解计算机系统--第三章摘抄
- bzoj1618[Usaco2008 Nov]Buying Hay 购买干草
- python3 学习-1(实现简单的服务器与客户端)
- 教你怎么阅读外文文献
- java.io.Serializable接口实现序列化
- Matlab 文件操作
- 谁说技术男没有人文情怀:当旅途遇到生命赞歌
- top 10 SMT paper
- 统治世界的十大算法
- hdu 1496
- leetcode-Gas Station
- 工作日志 6/2/2014 - SQL的stored procedure
- IOS开发计算文本尺寸