一、关于串行化
主要是将一个内存中不连续的对象变成一个连续的对象。
二、现在一般串行化方法
1.语言本身提供的串行化
这个像高级语言提供串行化方法
比如java通过implements Serializable就可以实现
C# BinaryFormatter类实现。
这个做法缺点是不能跨语言和平台通讯。
2.通过工具提供串行化
一般通过接口描述语言生成所要的对象
比如Web Service通过WSDL生成目标对象,这个生成的结构基于SOAP的,结构比较大。
CORBA通过IDL生成各种目标结构。
这种做法的优点是对于各种语言支持好
缺点是要平台有各自串行化和反串行化的支持算法。
三、这里我主要讨论一下ICE的串行化算法
ICE的串行化算法主要是通过工具提供串行化,这种算法串行化的特点是
编码简单,效率高,结构紧凑,传输方便。
ICE支持序列化的基本类型
bool,byte,short,int,long64,float,double
高级类型:
string,vector,map
结构类型:
enum,struct,class,iceexecption
ICE基本类型编码规范
ICE不使用网络字节序,使用的常用的低字节序,主要是对主流CPU(X86体系)字节序比较友好
bool 单个字节,值1 表示true, 0 表示false
byte 一个不作解释的字节
short 两个字节(LSB、MSB)
int 四个字节(LSB .. MSB)
long 八个字节(LSB .. MSB)
float 四个字节(23 位小数尾数、 8 位指数、符号位)
double 八个字节(52 位小数尾数、 11 位指数、符号位
尺寸
在数据编码中涉及到的许多类型,以及若干协议消息的成分,都有一个
与之相关联的尺寸或计数。尺寸是非负的数值。尺寸和计数是按下面两种
方式中的一种进行编码的:
1. 如果元素的数目少于255,尺寸就被编码成单个byte,指示元素的数目。
2. 如果元素的数目多于或等于255,尺寸就被编码成一个值为255 的
byte,再跟上一个int, 指示元素的数目。
255 以下的计数只需要一个字节,而不是四个字节。相应的代价是,
大于254 的计数需要五个字节,而不是四个字节。但是,对于长度大于254 的序列或串而言,
多出的一个字节无关紧要。
string
尺寸+实际字符串,(NULL)使用尺寸0表示
vector;
尺寸+实际数据。
enum:
如果枚举有1 - 127 个枚举符,枚举值被整编成一个byte。
如果枚举有128 - 32767 个成员,枚举值被整编成一个short。
如果枚举的成员多于32767 个,枚举值被整编成一个int。
枚举值就是对应的枚举符的序数值,第一个枚举符的值被编码成零。
struct:
结构的各个成员按照各自的类型,以它们在struct 声明中的出现次序进行编码。
class:
class类型比较复杂,和ICE平台规范相关比较多,这里就不在讨论,原理一样
如果要详细的编码规范,请参看
http://www.zeroc.com/download/Ice/3.3/Ice-3.3.1.pdf
现在我的云计算引擎参照了ICE编码方式
详细代码见
http://www.svnhost.cn/Project/Detail-4657.shtml