Problem with binary serialization using std::wstring
My project is using std::wstring extensively and I have been able to get both the text and xml serialization archives to work with it. However, I am getting a stream_error when trying to deserialize objects written to a binary archive. I think the serialization may be missing some objects. I have tracked the problem down to serializing a std::map<std::wstring, shared_ptr<IddKey>, iStringCompare> where IddKey is a class that supports serialization and iStringCompare is: struct iStringCompare{ bool operator()(const std::wstring& x, const std::wstring& y) const{ return boost::lexicographical_compare(x, y, boost::is_iless()); }; }; I have tried to replicate this problem in a simple test case to submit but have not been able to reproduce it outside of my real code. Here is the code that serializes to a binary archive: boost::filesystem::wpath path = iddPath; path.replace_extension(L"idd.bin"); { boost::filesystem::ofstream ofs(path); boost::archive::binary_oarchive out(ofs); out << iddFilePtr; } IddFilePtr newIddFilePtr; { boost::filesystem::ifstream ifs(path); boost::archive::binary_iarchive in(ifs); in >> newIddFilePtr; } I am not using binary_woarchive or binary_wiarchive because they don't compile with shared_ptr serialization and I have seen that you are not really supposed to use them. I am using the wstring versions of the text and xml archives that are working. Does anyone have any suggestions on how to track down my problem? Dan
Before we get too serious, a) double check that you're opening the stream with binary switch b) check the TRAC data base. There is a ticket which refers to wstring serialization in non-w archives. Check to see if this is your situation. Robert Ramey Macumber, Daniel wrote:
My project is using std::wstring extensively and I have been able to get both the text and xml serialization archives to work with it. However, I am getting a stream_error when trying to deserialize objects written to a binary archive. I think the serialization may be missing some objects. I have tracked the problem down to serializing a std::map<std::wstring, shared_ptr<IddKey>, iStringCompare> where IddKey is a class that supports serialization and iStringCompare is:
struct iStringCompare{ bool operator()(const std::wstring& x, const std::wstring& y) const{ return boost::lexicographical_compare(x, y, boost::is_iless()); }; };
I have tried to replicate this problem in a simple test case to submit but have not been able to reproduce it outside of my real code. Here is the code that serializes to a binary archive:
boost::filesystem::wpath path = iddPath; path.replace_extension(L"idd.bin");
{ boost::filesystem::ofstream ofs(path); boost::archive::binary_oarchive out(ofs); out << iddFilePtr; }
IddFilePtr newIddFilePtr;
{ boost::filesystem::ifstream ifs(path); boost::archive::binary_iarchive in(ifs); in >> newIddFilePtr; }
I am not using binary_woarchive or binary_wiarchive because they don't compile with shared_ptr serialization and I have seen that you are not really supposed to use them. I am using the wstring versions of the text and xml archives that are working. Does anyone have any suggestions on how to track down my problem?
Dan
participants (2)
-
Macumber, Daniel
-
Robert Ramey