6

プロトコルバッファのCodedOutputStreamとFileOutputStreamを使用して、複数のメッセージを次のようなファイルに順番にシリアル化します。

// File is opened using append mode and wrapped into
// a FileOutputStream and a CodedOutputStream
bool Open(const std::string& filename,
          int buffer_size = kDefaultBufferSize) {

    file_ = open(filename.c_str(),
                 O_WRONLY | O_APPEND | O_CREAT, // open mode
                 S_IREAD | S_IWRITE | S_IRGRP | S_IROTH | S_ISUID); //file permissions

    if (file_ != -1) {
        file_ostream_ = new FileOutputStream(file_, buffer_size);
        ostream_ = new CodedOutputStream(file_ostream_);
        return true;
    } else {
        return false;
    }
}

// Code for append a new message
bool Serialize(const google::protobuf::Message& message) {
    ostream_->WriteLittleEndian32(message.ByteSize());
    return message.SerializeToCodedStream(ostream_);
}

// Code for reading a message using a FileInputStream
// wrapped into a CodedInputStream 
bool Next(google::protobuf::Message *msg) {
    google::protobuf::uint32 size;
    bool has_next = istream_->ReadLittleEndian32(&size);
    if(!has_next) {
        return false;
    } else {
        CodedInputStream::Limit msgLimit = istream_->PushLimit(size);
        if ( msg->ParseFromCodedStream(istream_) ) {
            istream_->PopLimit(msgLimit);
            return true;
        }
        return false;
    }
}

GzipOutputStreamを使用して同じことを行うにはどうすればよいですか?CodedOutputStreamを使用する場合と同じように、gzip圧縮ファイルを再度開いて新しいメッセージを追加できますか?

4

1 に答える 1

1

FileOutputStreamを次のような別のGzipOutputStreamでラップする必要があることに気づきました。

file_ostream_ = new FileOutputStream(file_, buffer_size);
gzip_ostream_ = new GzipOutputStream(file_ostream_);
ostream_ = new CodedOutputStream(gzip_ostream_);

そして読むときは、同じことをしてください:

file_istream_ = new FileInputStream(file_, buffer_size);
gzip_istream_ = new GzipInputStream(file_istream_);
istream_ = new CodedInputStream(gzip_istream_);

ファイルを閉じて再度開くと、メッセージを追加することもできます。

于 2012-12-07T04:55:25.230 に答える