1

Google のプロトコル バッファに出くわしました。これは、私が書いている 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 ファイルに「移植」する際の助けをいただければ幸いです。

4

2 に答える 2

3

あなたは哲学を誤解していると思います。

IMHO Google の Protocol Buffers は、アプリケーション クラスとは異なる「メッセージ」クラスを生成するためのものです。Protobuf はシリアライゼーション ライブラリではないことに注意してください (ただし、そのように使用することはできます)。これは、異なるサブシステム/言語間でメッセージを交換できるメッセージング ライブラリです。

したがって、プロトはメッセージクラスを生成し、シリアライゼーション/デシリアライゼーションのためにストリームを独自のクラスのオブジェクトに変換します。あなたの仕事はプロトオブジェクトを実際のオブジェクトまたはオブジェクトのグループに変換することです。

これは、クラスの実際の実装をシリアライゼーション/デシリアライゼーション メカニズムから切り離す良い方法です。

于 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 に答える