在 protobuf 中,我们有几个选项来实现继承。“嵌套扩展”就是其中之一:http: //www.indelible.org/ink/protobuf-polymorphism/
这里有趣的是如何读取序列化文件。我们必须创建一个 Map 以将 Animal.type 与其扩展标识符对应,以便将动物转换为正确的 Dog 或 Cat。但是,在上面网站提供的示例中,使用的语言是 Python。这意味着可以在不指定键类型或值类型的情况下初始化 Map。而且效果很好:
# Unpack the serialized bytes.
animal = Animal()
animal.ParseFromString(bytes)
# Determine the appropriate extension type to use.
extension_map = { Animal.Cat: Cat.animal, Animal.Dog: Dog.animal }
extension = animal.Extensions[extension_map[animal.type]]
但是,为了在 C++ 中实现这样的映射,键类型和值类型是强制性的。那么,我应该使用什么类型的值才能将两个不同的扩展标识符存储到同一个映射中?
Map<Animal::Type, ::google::protobuf::internal::ExtensionIdentifier>
?
不幸的是,这显然行不通。
我还将在此处复制粘贴写作范例: from animals_pb2 import *
# Construct the polymorphic base message type.
animal = Animal()
animal.type = Animal.Cat
# Create the subclass type by referencing the appropriate extension type.
# Note that this uses the self-referential field (Cat.animal) from within
# nested message extension.
cat = animal.Extensions[Cat.animal]
cat.declawed = True
# Serialize the complete message contents to a string. It will end up
# looking roughly like this: [ type [ declawed ] ]
bytes = animal.SerializeToString()
Extensions() 函数可以让我们使用扩展的标识符来获取它的扩展。