C++ 如何使用Google';那是protobuf?

C++ 如何使用Google';那是protobuf?,c++,protocol-buffers,C++,Protocol Buffers,我刚刚访问了谷歌的协议缓冲区。它似乎是我正在编写的C++后端应用程序的解决方案。问题是我似乎找不到任何关于向量类型的东西。文档中提到了重复的类型,但我似乎找不到任何东西 假设我有这些类: class UnifiedBinaryHeader { public: UnifiedBinaryHeader(); void Serialize(std::ostream& output) const; void Deserialize(std::istream& i

我刚刚访问了谷歌的协议缓冲区。它似乎是我正在编写的C++后端应用程序的解决方案。问题是我似乎找不到任何关于向量类型的东西。文档中提到了重复的类型,但我似乎找不到任何东西

假设我有这些类:

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;
};
类统一二进制头
{
公众:
UnifiedBinaryHeader();
void序列化(std::ostream&output)常量;
void反序列化(std::istream&input);
私人:
wxString m_名称;
wxDateTime m_时间;
};
结构统一二进制
{
wxDateTime日期;
浮动值;
UnifiedBinaryRow()
{
数值=0;
}
void序列化(std::ostream&output)常量;
void反序列化(std::istream&input);
};
类UnifiedBinaryRowCollection
{
私人:
typedef std::向量统一二进制向量;
公众:
typedef unifiedbinarrowvector::迭代器迭代器;
typedef UnifiedBinarrowVector::常量迭代器常量迭代器;
UnifiedBinaryRowCollection();
迭代器begin();
常量迭代器begin()常量;
迭代器end();
常量迭代器end()常量;
UnifiedBinarrow收集和添加行(常量UnifiedBinarrow和行);
大小\u t NumRows()常量;
私人:
统一二次旋转矢量m_行;
};
类统一二进制格式
{
公众:
统一二进制格式();
UnifiedBinaryHeader&Header();
常量UnifiedBinaryHeader&Header()常量;
UnifiedBinaryFormat&Header(UnifiedBinaryHeader&Header);
UnifiedBinaryRowCollection&Rows();
常量UnifiedBinaryRowCollection&Rows()常量;
UnifiedBinaryFormat和Rows(常量UnifiedBinaryRowCollection和Rows);
void序列化(std::ostream&output)常量;
void反序列化(std::istream&input);
私人:
统一二元头m_头;
统一双向收集m_行;
};

鉴于我使用了大量向量成员,如何为这些类编写.proto文件。如果您能帮助我将这些类“移植”到我可以使用的.proto文件中,我将不胜感激。

我想您误解了这一理念

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

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


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

我认为转换为使用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; 
} 

好的,我想我理解你的意思(我在发布我的课程时也这么怀疑)。但是,如果您从上述类中获取“行为”(即序列化/反序列化等),我相信您会同意它们只是“容器”。然后,问题退化到如何“端口”一个C++类,其中包含其他C++类的向量(它们本身可能被嵌套)到一个.to to file文件?这里是C++教程:您可以注意到两件事:完全可以将消息嵌套在另一个消息中,并且
repeated
关键字允许模拟容器的行为。我将再次阅读文档,看看是否可以得到一个快速的示例。顺便说一下,我从我的头创建了.pto,并成功编译了它,以创建C++存根。我偷看了一下生成的文件,看到一些谷歌标题,例如:#include等。文件中没有提到这一点。我(很快)在谷歌上搜索了标题(大概还有一个链接库),但没有找到任何具体的内容。想分享一些光吗。。。(有人吗?)如名称所示,此标题与
protobuf
本身相关。如果可以生成头文件,则已经下载了包,它包含一个C++组件,您应该在构建系统中包含该组件。