Как лучше всего представить это в буфере протокола (.proto)? открытый класс EntityId {частный строковый тип; частный идентификатор строки; } открытый класс EntityBlob {частный String blobName; ...

1
Fireburn 3 Янв 2021 в 21:20

1 ответ

Лучший ответ

Свойство Map неплохо: карты поддерживаются в protobuf. Для типов свойств вы будете использовать сообщение, оборачивающее oneof. Так что это будет что-то вроде

message Entity {
  string dir = 1; 
  string entity_type = 2;
  string entity_id = 3;
  repeated EntityBlob blobs = 4;
  map<string, EntityProperty> properties = 5;
  map<string, EntityIdList> related_entities = 6;
}
message EntityProperty {
  oneof property_value {
    string string_value = 1;
    EntityArrayProperty array_value = 2;
    EntityObjectProperty object_value = 3;
    bool bool_value = 4;
    double double_value = 5;
  }
}
message EntityArrayProperty {
  repeated EntityProperty values = 1;
}
message EntityObjectProperty {
  map<string, EntityProperty> property_map = 1;
}
message EntityIdList {
  repeated EntityId ids = 1;
}
message EntityBlob {
  string blob_name = 1;
  bytes blob_bytes = 2;
}
message EntityId {
  string type = 1;
  string id = 2;
}

С другой стороны, похоже, что EntityProperty может быть эквивалентом google.protobuf.Value, поэтому вам, возможно, не придется писать его самостоятельно, но вы сможете использовать предопределенный тип сообщения.

2
Louis Wasserman 3 Янв 2021 в 18:30