1

我刚刚遇到了 Google 的协议缓冲区。这似乎是我正在编写的 C++ 后端应用程序的解决方案。问题是我似乎找不到任何有关矢量类型的信息。文档提到了repeat_types,但我似乎找不到任何东西。

假设我有这些类:

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 文件中的任何帮助将不胜感激。

4

2 回答 2

3

我认为你误解了哲学。

恕我直言,Google 的协议缓冲区旨在生成与您的应用程序类不同的“消息”类。请注意,Protobuf 不是序列化库(尽管它可能被用作这样的库)。它是一个消息传递库,允许在不同子系统/语言之间交换消息。

因此,proto 将生成消息类,然后对于您的序列化/反序列化,它将流转换为其自己的类的对象,您的工作是将 proto 对象转换为您的实际对象或对象组。

这是将类的实际实现与 imo 的序列化/反序列化机制分离的好方法。

于 2009-12-11T16:05:36.917 回答
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; 
} 
于 2010-04-20T18:46:47.367 回答