您好,欢迎访问一九零五行业门户网

对象的序列化

对象的序列化 
序列化就是保存对象中的状态(即类中的属性),就是将对象的实例变量和引用变量存储成为磁盘中的一个文件,以便以后重新使用该对象的时候不用再重新创建。而解序列化就是恢复对象的状态,读取磁盘中的序列化文件,将每项状态赋值给对象,并被新的引用变量引用。 
在对象被序列化时,该对象所引用的实例变量都会被序列化。 
当然我们也能把一个类序列化,方法就是将该类实现serialization接口,这个接口没有需要实现的方法,只是用来告诉虚拟机实现这个接口的类都可以被序列化。 
如果在被序列化的类中有未实现序列化的类的实例对象,有点拗口;换个说法,就是在类dog中有类student的实例变量,类dog实现了serialization接口,而student类没有实现,这时候如果将类dog序列化,执行期会抛出异常。这时我们就需要transient(瞬时)来标记住不需要和不应该序列化的变量,使用transient需要先import java.net.*。在还原的时候被transient的引用变量值会变为null,primitive主数据类型变量会被还原成默认值。 
静态变量是不可被序列化的,因为静态变量是在类上面的变量。 
记得用jdk里面的serialver工具来查询类的seriaversionuid(版本id)。 
再还原对象时会比对该对象的类的版本id如果不对就会还原失败,一般这个值都被标记为final static 存在类中。 
序列化的流程如下: 
⑴先创建出fileoutputstring对象,该对象用来存取生成的文件。 
fileoutputstream  fs=new fileoutputstream(“test.ser”); 
test.ser就是生成的文件名,在字符串中你可以定义要输出的文件的路径。例如d:\\javaserialization\\test.ser 
好像必须要双反斜杠,不然会报错。 
⑵创建objectoutputstream对象,将你所需要序列化的对象写入fileoutputstring对象fs。 
objectoutputstream  oos=new objectoutputstream  (fs); 
传入fs。 
⑶将对象的引用变量名写入objectoutputstream对象的writerobject方法中。 
oos.writerobjec(test); 
test就是被序列化的对象的引用变量名。 
即object test=new object(); 
⑷最后不要玩了关闭objectoutputstream。
oos.close();
以上就是对象的序列化
下面来说对象的解序列化 
当我们需要用到被序列化的对象时,我们就要将该对象解序列化,好像是废话。 
对象的解序列化也是四步: 
⑴连接对象序列化文件 
fileinputstrieam  fip=new fileinputstrieam(“test.ser”); 
注意如果不在当前目录下要加上文件的路径,如果虚拟机找不到这个文件就会抛出异常。 
⑵创建objectinputstream对象来读取序列化文件 
objectinputstream  ois=new objectinputstream  (fip); 
⑶通过readobject方法返回一个object类型的对象。还需要将object对象的类型转换回原来的类型。 
object new=ois.readobject(); 
注意在序列化文件中可能会存有不止一个的对象的序列化文本,他会按照文本的顺序来读取文本数据。 
每次调用readobject方法都会读出下一个对象。 
⑷最后关闭objectinputstream 
ois.close(); 
package com.xuliehuatest; //需要先引用java中的io包,才能实现serializable接口。 import java.io.*; import java.util.arraylist; import javax.print.attribute.standard.sides; //先建立一个可供序列化的类dogtest。 //然后在main方法中队类dogtest的对象进行序列化。 public class dogtest implements serializable{ private int size; private string name; public void setsize(int size){ this.size=size; } public void setname(string na){ name=na; } public int getsize(){ return size; } public string getname(){ return name; } public static void main(string[]args){ dogtest dt=new dogtest(); dogtest dt1=new dogtest(); dogtest dt2=new dogtest(); arraylist<dogtest> arraylist=new arraylist<dogtest>(); arraylist.add(dt); arraylist.add(dt1); arraylist.add(dt2); dt.setsize(12); dt.setname("xiao bao"); dt1.setsize(25); dt1.setname("tu qiang"); dt2.setsize(31); dt2.setname("da gei gou"); try{ int x=0; fileoutputstream f=new fileoutputstream("c:\\daxue.ser"); objectoutputstream oo=new objectoutputstream(f); while(x<3){ //将对象被序列化前的状态打印 system.out.println(x); system.out.println("size="+arraylist.get(x).getsize()+" "); system.out.println("name="+arraylist.get(x).getname()); system.out.println(arraylist.get(x)); oo.writeobject(arraylist.get(x)); x=x+1; } oo.close(); }catch(exception ex){ ex.printstacktrace(); } } }
package com.xuliehuatest; import java.io.*; import java.util.arraylist; public class jiexuliehua { static arraylist<object> arraylist=new arraylist<object>(); public static void main(string[] args){ try{ fileinputstream fdi=new fileinputstream("c:\\liheng.ser"); objectinputstream oi=new objectinputstream(fdi); object o1=oi.readobject(); object o2=oi.readobject(); object o3=oi.readobject(); arraylist.add(o1); arraylist.add(o2); arraylist.add(o3); int x=0; while(x<3){ //将解序列化的对象状态进行打印 system.out.println(x); system.out.println((dogtest)arraylist.get(x)); system.out.println("name = "+((dogtest)arraylist.get(x)).getname()); system.out.println("size = "+((dogtest)arraylist.get(x)).getsize()); x=x+1; } oi.close(); }catch(exception ex){ ex.printstacktrace(); } }
其它类似信息

推荐信息