ceph中的序列化

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值