Hi Rush, Good to know that you're using the same way to deserialize something. Thanks for letting me know! I printed out the string, and it wasn't empty. It turned out that it did not like the .size() that I was giving it. I ended up giving it the length, and things worked.
-Jack -----Original Message----- From: Rush Manbert [mailto:[email protected]] Sent: Thursday, October 31, 2013 9:21 AM To: [email protected] Subject: Re: initializing TMemoryBuffer in C++ On Oct 30, 2013, at 6:36 PM, Chan, Jack wrote: > Hi, > > I'm having trouble initializing a TMemoryBuffer with contents. I serialized > an object (a ContactsList object) with TCompactProtocol and then wrote it out > as a file to disk. Now, I'm trying to read that file and create the same > object, but it appears that when I call the object's .read() function, it > says "No more data to read." I suspect that I did not correctly initialize > the TMemoryBuffer with anything. Here is what I'm doing: > > // contacts_bin is a std::string that is read in from disk and is a > binary string encoded with TCompactProtocol) // contacts_bin_copy is a copy > of contacts_bin except it's a char* instead of a std::string. > ContactsList object; > shared_ptr<TMemoryBuffer> transportIn(new TMemoryBuffer((unsigned > char*)contacts_bin_copy, contacts_bin.size())); > shared_ptr<TCompactProtocol> protocolIn(new > TCompactProtocol(transportIn)); object.read(protocolIn.get()); > > So, I am creating a new TMemoryBuffer by providing a string and the size of > that string to the constructor. I might not be doing it right, which is why > I'm getting problems. Might the buffer have nothing in it because I did not > change the memory policy to COPY? If that's the case, what's the correct code > that will do it? > > Thanks, > Jack > Hi Jack, Here's a function we use to do something very similar: template <class T> void readThriftObjFromBuffer(const void* inBuffer, const size_t inBufferSize, T& outThriftStruct) { // Instance the memory buffer and simple binary protocol, then read the structure from it. boost::shared_ptr<TMemoryBuffer> memoryBuffer( new TMemoryBuffer(const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(inBuffer)), inBufferSize, TMemoryBuffer::OBSERVE) ); boost::shared_ptr<TProtocol> binaryProtocol( new TBinaryProtocol(memoryBuffer) ); outThriftStruct.read(binaryProtocol.get()); } It seems to me that what you're doing should work. Have you verified that your write really worked and that contacts_bin_copy really points to a string that has nonzero size? - Rush
