两个 protobuf 新功能

oneof

这个功能类似 C/C++ 的 union,它可以把几个不可能共存的 field 组织在一起,这样也可以作为一种 closed polymorphism 来使用。它除了原生的一些 API 以外,还提供了一些便于做 dynamic check 的 API,比如:提供了一个 enum 表示被设置的是哪个 field,_case() 返回这个 enum,clear_*() 用于清除设置的 oneof。

一个具体的例子是比如我们需要实例化一个 Foo 的子类,Bar、Baz 和 Bzar,他们的构造函数不同,比如接受三种不一样的 message type,就可以通过 oneof 将三个 field group 在一起,同时创建一个 factory method,根据这个 oneof 获得的类型调用对应的构造函数。

map

这是一个呼声很高的 feature,最终进入了 protobuf,在没有这个东西以前,一个比较常见的做法就是需要某种 map 的时候就定义一个类似 std::pair 的 message type,比如使用 nested message 控制这个类型的范围,里面都是用 key/value 表示两个 field,但这样一来,就需要通过某个 template method 将这个 repeated field 转换到一个实际的 map 才能使用,同时面临两个问题:如果是 map 需要 operator<,如果是 unordered_map 则需要 hash function 和 operator==,对于 protobuf 来说这些都是 missing pieces,这样一来 protobuf 要求 key 只能是整数或者字符串。同时 map 不能使用 required/optional/repeated,因为它本质上仍然是通过我们这种比较土的方式生成的,只是在外面套上了一个类似 STL map 的 interface 而已(参看这里)。

通过 map 在很多需要表示(简易)关联的场合会轻松许多,但是如果需要做复杂的 lookup,可能这不是一个很好的选择。

arena 内存分配

主要是一类似 memory pool 的东西,方便批量释放内存,提高 service 的 performance 可以考虑。

——————
Then there passed by Midianites merchantmen; and they drew and lifted up Joseph out of the pit, and sold Joseph to the Ishmeelites for twenty pieces of silver:and they brought Joseph into Egypt

Advertisements
两个 protobuf 新功能

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s