2009-12-11 7 views
1

Я только что приступил к буферам протокола Google. Кажется, это решение для используемого мной программного обеспечения на C++. Проблема в том, что я не могу найти что-либо в отношении типов векторов. В документации упоминается repeat_types, но я не могу найти что-либо.Как написать эти классы с помощью протобуфа Google?

Предположим, я это набор классов:

class UnifiedBinaryHeader 
{ 
public: 
    UnifiedBinaryHeader(); 

    void Serialize(std::ostream& output) const; 
    void Deserialize(std::istream& input); 

private: 
    wxString m_name; 
    wxDateTime m_time; 
}; 

struct UnifiedBinaryRow 
{ 
    wxDateTime date; 
    float value; 

    UnifiedBinaryRow() 
    { 
     value= 0; 
    } 

    void Serialize(std::ostream& output) const; 
    void Deserialize(std::istream& input); 
}; 

class UnifiedBinaryRowCollection 
{ 
private: 
    typedef std::vector<UnifiedBinaryRow> UnifiedBinaryRowVector; 

public: 
    typedef UnifiedBinaryRowVector::iterator iterator; 
    typedef UnifiedBinaryRowVector::const_iterator const_iterator; 

    UnifiedBinaryRowCollection(); 

    iterator begin(); 
    const_iterator begin() const; 
    iterator end(); 
    const_iterator end() const; 

    UnifiedBinaryRowCollection& AddRow(const UnifiedBinaryRow& row); 

    size_t NumRows() const; 

private: 
    UnifiedBinaryRowVector m_rows; 
}; 


class UnifiedBinaryFormat 
{ 
public: 
    UnifiedBinaryFormat(); 

    UnifiedBinaryHeader& Header(); 
    const UnifiedBinaryHeader& Header() const; 
    UnifiedBinaryFormat& Header(UnifiedBinaryHeader& header); 

    UnifiedBinaryRowCollection& Rows(); 
    const UnifiedBinaryRowCollection& Rows() const; 
    UnifiedBinaryFormat& Rows(const UnifiedBinaryRowCollection& rows); 

    void Serialize(std::ostream& output) const; 
    void Deserialize(std::istream& input); 

private: 
    UnifiedBinaryHeader m_header; 
    UnifiedBinaryRowCollection m_rows; 
}; 

Как я могу написать файл .proto для этих классов, видя, как я использую много членов, которые являются переносчиками. Любая помощь в «переносе» этих классов в файл .proto, который я могу использовать, будет очень оценена.

ответ

3

Я думаю, вы неправильно поняли философию.

IMHO Буферы протокола Google предназначены для создания класса сообщений, отличных от ваших классов приложений. Обратите внимание, что Protobuf НЕ является библиотекой сериализации (хотя он может использоваться как таковой). Это библиотека обмена сообщениями, которая позволяет обмениваться сообщениями между различными подсистемами/языками.

Таким образом, proto будет генерировать класс сообщений, а затем для вашей сериализации/десериализации он преобразует поток в объект своего класса, а ваше задание - преобразовать прото-объект в ваш фактический объект или группу объектов.

Это прекрасный способ отделить фактическую реализацию класса от механизма сериализации/десериализации imo.

+0

Хорошо, я думаю, я понимаю, что вы говорите (я подозревал, как много при размещении моих занятий). Однако, если вы возьмете «поведение» (например, сериализацию/десериализацию и т. Д.) Из вышеперечисленных классов, я уверен, вы согласитесь, что они просто «контейнеры». Затем возникает вопрос о том, как я могу «переносить» класс C++, который содержит вектор других классов C++ (которые могут быть вложенными) в файл .proto? –

+0

Вот учебник C++: http://code.google.com/intl/fr/apis/protocolbuffers/docs/cpptutorial.html, вы можете отметить 2 вещи: вполне возможно вложить сообщения друг в друга, а «повторить 'keyword позволяет эмулировать поведение контейнеров. –

+0

Я снова прочитаю документы и посмотрю, смогу ли я получить быстрый пример для работы. Кстати, –

0

Я думаю, что ответ для преобразования с использованием Protobuf сообщений что-то вроде этого:

message Classroom { 
    required int id = 1; 
    required People teacher = 2; 
    repeated People bar = 3; 
} 

message People { 
    required int id = 1; 
    required string name = 2; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^