2009-12-11 2 views
1

Je viens de croiser les tampons de protocole de Google. Il semble être la solution pour une application backend C++ que j'écris. Le problème est que je ne peux pas sembler trouver quelque chose concernant les types de vecteurs. La documentation mentionne les types répétés, mais je n'arrive pas à trouver quelque chose.Comment écrire ces classes en utilisant protobuf de Google?

Et si j'ont ces ensemble de classes:

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; 
}; 

Comment puis-je écrire un fichier .proto pour ces classes, car je me sers beaucoup de membres qui sont des vecteurs. Toute aide pour "porter" ces classes dans un fichier .proto que je peux utiliser sera très appréciée.

Répondre

3

Je pense que vous avez mal compris la philosophie.

IMHO Les tampons de protocole de Google sont conçus pour produire une classe 'messages' distincte de vos classes d'application. Notez que Protobuf n'est PAS une bibliothèque de sérialisation (bien qu'elle puisse être utilisée comme telle). C'est une bibliothèque de messagerie, qui permet d'échanger des messages entre différents sous-systèmes/langues. Donc, proto va générer des messages class, et ensuite pour votre sérialisation/désérialisation il va convertir le flux en un objet de sa propre classe et votre travail est de convertir l'objet proto en objet réel, ou en groupe d'objets.

C'est une bonne manière de découpler l'implémentation réelle de la classe du mécanisme de sérialisation/désérialisation.

+0

Ok, je pense que je comprends ce que vous dites (je doutais lors de la publication de mes cours). Cependant, si vous prenez les "comportements" (c'est-à-dire la sérialisation/désérialisation, etc.) des classes ci-dessus, je suis sûr que vous serez d'accord qu'il s'agit simplement de "conteneurs". La question dégénère alors en comment puis-je "porter" une classe C++ qui contient un vecteur d'autres classes C++ (qui peuvent elles-mêmes être imbriquées) dans un fichier .proto? –

+0

Voici le tutoriel C++: http://code.google.com/intl/fr/apis/protocolbuffers/docs/cpptutorial.html, vous pouvez noter 2 choses: il est parfaitement possible d'imbriquer les messages les uns dans les autres et les 'répétés 'mot-clé permet d'émuler le comportement des conteneurs. –

+0

Je vais lire les docs à nouveau et voir si je peux obtenir un exemple rapide pour travailler. Incidemment, –

0

Je pense que la réponse à la conversion à l'aide de messages protobuf est quelque chose comme ceci:

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

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