我刚刚进入谷歌的协议缓冲区。它似乎是我正在编写的C ++后端应用程序的解决方案。问题是我似乎找不到任何关于矢量类型的东西。文档提到了repeated_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文件中的任何帮助都将非常感激。
答案 0 :(得分:3)
我认为你误解了这个哲学。
恕我直言Google的协议缓冲区旨在生成与您的应用程序类不同的“消息”类。请注意,Protobuf不是序列化库(尽管它可以这样使用)。它是一个消息传递库,允许在不同的子系统/语言之间交换消息。
因此,proto将生成消息类,然后对于序列化/反序列化,它将流转换为其自己的类的对象,您的工作是将proto对象转换为您的实际对象或对象组。 / p>
这是将类的实际实现与序列化/反序列化机制imo分离的好方法。
答案 1 :(得分: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;
}