Кодирование циклических структур данных (например, направленных графов) с использованием протокольных буферов - PullRequest
5 голосов
/ 09 декабря 2011

У меня есть структура данных графа, которую я хотел бы закодировать с помощью буферов протокола . Между вершинами графа существуют циклические связи. Существует ли стандартный / общий способ кодирования таких структур в protobuf? Один подход, который приходит на ум, - это добавить поле «id» в каждую вершину и использовать эти идентификаторы вместо указателей. E.g.:

message Vertex {
  required int32 id = 1;
  required string label = 2;
  repeated int32 outgoing_edges = 3; // values should be id's of other nodes
}

message Graph {
  repeated Vertex vertices = 1;
}

Тогда я мог бы написать классы, которые обертывают сгенерированные протобуфом классы, и автоматически преобразовывать эти идентификаторы в реальные указатели при десериализации (и обратно в идентификаторы при сериализации). Это лучший подход? Если так, то кто-нибудь знает о существующих проектах, которые используют / документируют этот подход? Если нет, то какой подход вы бы порекомендовали?

1 Ответ

2 голосов
/ 10 декабря 2011

Если вам нужна кроссплатформенная поддержка, то используйте DTO, как вы предлагаете в вопросе, а затем сопоставьте ее с отдельной моделью на основе графов в вашем собственном коде , вероятно, ваш лучший подход.

В качестве примечания, в protobuf-net (c # / .net) я добавил поддержку для этого, которая добавляет уровень абстракции в режиме без вывода сообщений. В основном, следующие работы:

[ProtoContract]
class Vertex {
   ...
    [ProtoMember(3, AsReference = true)]
    public List<Vertex> OutgoingEdges {get;set;}
}
...