ceph中的序列化

来源:互联网 发布:钱宝数据助手新手套餐 编辑:程序博客网 时间:2024/06/06 19:00

std::map< string, bufferlist > 序列化map到bufferlist中

encode(map A,bufferlist B)

1.求出map中的元素个数。
count = A.size()
2.把A元素个数序列化到B中。见整型的序列化
B->count,
3.对A中的元素逐个再次调用encode,序列化到bufferlist B中

p = A.begin()encode(p->first, B)encode(p->second, B)

这里的p->first 是string类型,p->second是bufferlist类型。
(见下面string的序列化,bufferlist序列化)

string类型的序列化:
1.求出string的长度。

__u32 len = s.length();

2.把string的长度先序列化到bufferlist中。
encode(len, bl);
3.把string的数据部分追加到bufferlist中。
if (len)
bl.append(s.data(), len);

整型类型的序列化:

#define WRITE_INTTYPE_ENCODER(type, etype)              \  inline void encode(type v, bufferlist& bl, uint64_t features=0) { \    ceph_##etype e;                                 \    e = v;                                                              \    encode_raw(e, bl);                          \  }                                 \  inline void decode(type &v, bufferlist::iterator& p) {        \    ceph_##etype e;                         \    decode_raw(e, p);                           \    v = e;                              \  }WRITE_INTTYPE_ENCODER(uint64_t, le64)template<class T>inline void encode_raw(const T& t, bufferlist& bl){  bl.append((char*)&t, sizeof(t));}

将整型强制转换成字符类型,然后追加到bufferlist中。

bufferlist的序列化到bufferlist中:

inline void encode(const bufferlist& s, bufferlist& bl) {  __u32 len = s.length();  encode(len, bl);  bl.append(s);}

1.先获取源bufferlist的长度
2.然后将源bufferlist的长度先序列化到目标bufferlist
3.最后把源bufferlist中的数据追加到目标bufferlist中。

总的来说,ceph中的序列化基本步骤:选获取源目标的大小,将大小先序列化到bufferlist中(整型除外),
然后再把真实数据追加到bufferlist中。(复杂类型通过递归的方式序列化到bufferlist中)

该序列化除了基本的数据类型都提供了encode/decode,需要跨网络传输的自定义类型(类)都提供了encode/decode。

0 0
原创粉丝点击