博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java对象的序列化和反序列化实践
阅读量:5134 次
发布时间:2019-06-13

本文共 2346 字,大约阅读时间需要 7 分钟。

2013-12-20 14:58

对象序列化的目标是将对象保存在磁盘中,或者允许在网络中直接传输对象。对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上或者通过网络将之传送到另一个网络节点。

而一旦其他程序获得这种二进制流,即可将之恢复为Java对象。

转载自: 

文中,原作者提到了两种序列化&反序列化的方式, 一是直接利用流对象来read/write,这种方式比较简单,按照默认方式序列化,所以有时候需要自己控制类的序列化方式,可以在可序列化类中提供以下形式的writeObject()和readObject()方法。

当进行序列化&反序列化操作时,如果有这两个方法,那么会优先执行这两个方法,测试代码如下:

1 public class ObjectSaver { 2  3     public static void main(String[] args) throws Exception { 4         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream( 5                 "objectFile.obj")); 6  7         // 序列化对象 8         Customer customer = new Customer("阿蜜果", 24); 9         out.writeObject("你好!");10         out.writeObject(new Date());11         out.writeObject(customer);12         out.writeInt(123); // 写入基本类型数据13         out.close();14 15         // 反序列化对象16         ObjectInputStream in = new ObjectInputStream(new FileInputStream(17                 "objectFile.obj"));18         System.out.println("obj1=" + (String) in.readObject());19         System.out.println("obj2=" + (Date) in.readObject());20         Customer obj3 = (Customer) in.readObject();21         System.out.println("obj3=" + obj3);22         int obj4 = in.readInt();23         System.out.println("obj4=" + obj4);24         in.close();25     }26 }27 28 class Customer implements Serializable {29     private static final long serialVersionUID = 1L;30     private String name;31     private int age;32 33     public Customer(String name, int age) {34         this.name = name;35         this.age = age;36     }37 38     public String toString() {39         return "name=" + name + ", age=" + age;40     }41 42     private void writeObject(java.io.ObjectOutputStream out) throws IOException {43         out.defaultWriteObject();44         System.out.println("writeObject==========");45         out.writeObject(name);46         out.writeInt(age);47     }48 49     private void readObject(java.io.ObjectInputStream in) throws IOException,50             ClassNotFoundException {51         in.defaultReadObject();52         System.out.println("writeObject==========");53         name=(String) in.readObject();54         age=in.readInt();55     }56 }

如上,如果没有write&read两个方法,程序能正常执行。

如果write&read两个方法存在,但方法体为空,那么发序列化结果为null;

write&read两个方法存在,则只有按照上面代码,结果才是正确的。

有兴趣的可以自己试试。

转载于:https://www.cnblogs.com/wlrhnh/p/3483889.html

你可能感兴趣的文章
Linux环境下MySql安装和常见问题的解决
查看>>
lrzsz——一款好用的文件互传工具
查看>>
ZPL语言完成条形码的打印
查看>>
这20件事千万不要对自己做!
查看>>
Linux环境下Redis安装和常见问题的解决
查看>>
玩转小程序之文件读写
查看>>
HashPump用法
查看>>
cuda基础
查看>>
virutalenv一次行安装多个requirements里的文件
查看>>
Vue安装准备工作
查看>>
.NET 母版页 讲解
查看>>
Android Bitmap 和 Canvas详解
查看>>
最大权闭合子图
查看>>
oracle 创建暂时表
查看>>
201421410014蒋佳奇
查看>>
导入导出数据库和导入导出数据库表
查看>>
linux下操作mysql
查看>>
【03月04日】A股滚动市盈率PE历史新低排名
查看>>
Xcode5和ObjC新特性
查看>>
jvm slot复用
查看>>