1

次の実装を検討してください。

person.proto:

    enum PhoneType {
  MOBILE = 0;
  HOME = 1;
  WORK = 2;
}

message PhoneNumber {
  required float number = 1;
  required PhoneType type = 2;
}

message Person {
  required string name = 1;
  optional PhoneNumber number = 2;
}

main.cpp:

#include <stdint.h>
#include <stdio.h>

#include "person.pb.h"

#include <iostream>

int main(int argc, char *argv[])
{
    static const uint32_t outputbuflen = 1024;
    uint8_t outputbuffer[outputbuflen];
    uint32_t writtenlenght = 0;

    // Encode a person and send it over any datalink.

    // SENDER
    Person p_sender;
    p_sender.set_name("FooBar");

    // Set the phonenumber.
    // Does not work because returns const ref.
    // p.number().set_number(0123123);

    // Is this correct?
    PhoneNumber * number = p_sender.mutable_number();
    number->set_number(0800123123.0);
    number->set_type(MOBILE);

    p_sender.SerializeToArray(outputbuffer, outputbuflen);
    writtenlenght = p_sender.ByteSize();

    std::cout << writtenlenght << "B written to output."<< std::endl;

    // Great, now send the stream somwhere
    // sendStream(...);

    // RECEIVER
    // Does not know how many bytes to expect, so we'll let protobuf handle that.
    // Simulate a reception loop.
    Person p_receiver;
    uint32_t bytesparsed;
    for(bytesparsed = 0; bytesparsed < writtenlenght; bytesparsed++){
        // Look at the data as if receiving it byte by byte.
        std::cout << "Trying to parse message " << bytesparsed << std::endl;
        if(p_receiver.ParseFromArray(outputbuffer, bytesparsed)){
            std::cout << "Found message" << std::endl;;
            break;
        }
    }

    std::cout << "Needed " << bytesparsed << "B to read message, but has still " \
              << writtenlenght - bytesparsed << "B left in buffer" << std::endl;
    return 0;
}

使用: https://developers.google.com/protocol-buffers/ 実際の状況では、受信者は受信する必要があるバイト数を認識していませんが、protobuf は (私の理解では) 完全にチェックできる必要があります。バッファからのメッセージ。オプションのメッセージがない場合、これはうまくいくようです。現時点ではそれは起こらず、電話番号のない壊れた人になってしまいます。:) 私は何を間違っていますか? この状況をどのように処理する必要がありますか?

4

1 に答える 1

0

Protocol Buffers シリアライゼーション形式は、フレーミング (つまり、シリアライズされたメッセージをストリームにパックしたり、メッセージを区切ったりすること) をカバーしていません。自分でやる必要があります。

ただし、いくつかの確立された慣行があります。詳細については、次の 2 つの回答を確認してください。

于 2012-06-03T18:41:17.990 に答える