web-dev-qa-db-ja.com

人に優しいProtobufメッセージを印刷する

Google Protobufメッセージの人にやさしいコンテンツを印刷する可能性はどこにもありませんでした。

Python for Java's toString()またはC++のDebugString()に同等のものはありますか?

18

protobuf パッケージを使用している場合、print関数/ステートメントは、 __str__ メソッド:-)。

9
cdonts

pythonprotobuf 2.0を使用した読み取り/書き込みhum​​an friendlyテキストファイルの例を次に示します。

from google.protobuf import text_format

テキストファイルから読み取る

f = open('a.txt', 'r')
address_book = addressbook_pb2.AddressBook() # replace with your own message
text_format.Parse(f.read(), address_book)
f.close()

テキストファイルに書き込む

f = open('b.txt', 'w')
f.write(text_format.MessageToString(address_book))
f.close()

c ++と同等のものは次のとおりです。

bool ReadProtoFromTextFile(const std::string filename, google::protobuf::Message* proto)
{
    int fd = _open(filename.c_str(), O_RDONLY);
    if (fd == -1)
        return false;

    google::protobuf::io::FileInputStream* input = new google::protobuf::io::FileInputStream(fd);
    bool success = google::protobuf::TextFormat::Parse(input, proto);

    delete input;
    _close(fd);
    return success;
}

bool WriteProtoToTextFile(const google::protobuf::Message& proto, const std::string filename)
{
    int fd = _open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd == -1)
        return false;

    google::protobuf::io::FileOutputStream* output = new google::protobuf::io::FileOutputStream(fd);
    bool success = google::protobuf::TextFormat::Print(proto, output);

    delete output;
    _close(fd);
    return success;
}
28
Neil Z. Shao

回答どおり、printおよび__str__機能しますが、デバッグ文字列以外には使用しません。

ユーザーが目にする可能性のあるものに書き込んでいる場合は、 google.protobuf.text_format モジュール。さらにいくつかのコントロール(UTF8文字列をエスケープするかどうかなど)と、テキスト形式をprotobufとして解析するための関数があります。

3
Rafael Lerm