Java对象序列化给分布式计算带来的方便 (转)

来源:互联网 发布:mysql分页高效 编辑:程序博客网 时间:2024/06/10 22:01
在面向对象程序语言中做分布式计算的时候,经常需要将对象在不同的主机之间传输,我这次在实现分布式计算的时候,需要将一个计算对象从中央服务器Server分发给所有的客户端client。
通过网络TCP,建立Socket,传输一个对象,就需要将对象转换成一段字节流,也就叫做对象的序列化。同时,也要求可以从这段字节流,创建出对应的对象出来。
C++里面的做法就是在每个类里面实现两个接口函数,自己通过写读和写对象的方法,来实现序列化。因为每个类的成员变量的值和成员变量的类型作者自己肯定晓得,所以就需要自己来通过把一个个成员变量写到流里面,最终实现了对象到字节流的转换。
C++里面针对纯数据类型的结构体,就是成员变量没有指针的对象的话,还可以通过拷贝内存块到字节流的方法memcpy,也可以很容易实现序列化,但是这只能是针对成员变量都是数据类型,没有指针类型的对象。
在Java里面就比较方便了,直接通过实现java.io.Serializable接口,JVM就能自动来将类实现序列化。同时,java.io.Serializable接口没有任何接口函数,只是一个空接口,唯一的作用就是标志一下这个类是可以序列化。
其实,Java里面的对象序列化,是JVM在做的,因为JVM可以掌控整个对象的内部数据结构,就可以简单遍历树的方法,来实现把一个对象的所有成员变量写到字节流里面。当然,居然怎么做的,我也不太清楚,但是所有JVM来说,要做这一点还是很容易的。
Java里面,几乎所有的类只要实现了java.io.Serializable接口,就可以实现序列化。但是要求这个类里面的所有成员变量也是可以序列化的。比如类A有个成员变量对象是类B,如果A能序列化,要求B也要能够序列化,也就是A实现了java.io.Serializable,要求B也一定实现java.io.Serializable。
网上关于具体实现序列化的Sample代码很多了,我这里只是贴出一段参考:
序列化对象都是通过Java的ObjectInputStream和ObjectOutputStream来实现的。
写:
       
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(A);
       读:
 
ObjectInputStream ios =new ObjectInputStream(is);
A a
=(A)ios.readObject();
原创粉丝点击