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。