0

バイナリ に問題がありostringstreamます。Googleのdense_hash_mapをシリアル化したい。これはファイルハンドルを使用して可能ですが、ドキュメントではこれが可能である必要があると主張しostringstreamていても、を使用していません。

次のコードが機能します。

char *serializeTable( size_t &length ) {
    // serialize to a temp file
    FILE *f = fopen("D:\\Dumps\\Serialization2File.txt", "w");
    bool result1 = serialize<Serializer, FILE>(m_serializer, f);
    std::cout << "result1 = " << result1 << std::endl;

    fseek(f, 0, SEEK_END);
    int mylen = ftell(f);
    fclose(f);

    // read binary data from file
    char *readbuf = new char[mylen];
    std::ifstream rf("D:\\Dumps\\Serialization2File.txt", std::ios_base::binary);
    rf.read(readbuf, mylen);
    rf.close();

    std::ofstream check("D:\\Dumps\\CheckSerializer.txt", std::ios_base::binary);
    check.write(readbuf, mylen);
    check.close();

    length = mylen;
    return readbuf;
}

次のコードは、最初の4つのシンボルのみを出力します。配列の残りの部分は、次のもので構成されます'\0'

char *serializeTable( size_t &length ) {
    std::ostringstream output("", std::stringstream::out | std::stringstream::binary);
    bool result = serialize<Serializer, std::ostringstream>(m_serializer, &output);
    auto str = output.str();
    std::cout << "str = " << str << std::endl;
}

出力:

str = W�B

それ以外の:

E1eGQgAAAAAAAgAAAAAAAAAAksFLAAAAAAAAAAAAAAAAAGWwQAUAAAAAAAAAAAAAAAAAakANCg.....
4

1 に答える 1

0

ドキュメントを検索して試してみた後、私は自分で答えを見つけました。

ストリームに格納されている個別の文字にアクセスするには、ストリームイテレータ(http://www.dyn-lab.com/articles/c-streams.html、パート6)を使用する必要があります。

私のコードは次のようになります。

char *serializeTable( size_t &length ) {

    std::stringstream stream("", std::stringstream::out | std::stringstream::in | std::stringstream::binary);
    //std::ostringstream output("", std::stringstream::binary);


    bool result = serialize<Serializer, std::stringstream>(m_serializer, &stream);
    std::istreambuf_iterator<char> itt(stream.rdbuf()), eos;
    std::vector<char> serialVector;
    serialVector.reserve(619999); // just a guess
    while(itt != eos) {
        char c = *itt++;
        serialVector.push_back(c);
    }

    length = serialVector.size();

    char *serial = new char[length];
    int index = 0;
    for each(char a in serialVector) {
        serial[index++] = a;
    }
    return serial;
}

コメントありがとうございます、皆さん!

于 2013-03-15T15:40:39.207 に答える