Commit 2e3d77f1 authored by Davis E. King's avatar Davis E. King
Browse files

Changed the code so that literal strings "i.e. stuff like this" are

serialized using the same format as std::string.  Previously, the
trailing 0 was also saved so if you deserialized them into a std::string
you ended up with a trailing 0 in the std::string which isn't what you
want.
parent 8f022c00
......@@ -1281,6 +1281,17 @@ namespace dlib
}
}
// ----------------------------------------------------------------------------------------
inline void serialize(const char* item, std::ostream& out)
{
// We serialize literal strings the same way we serialize std::string, that is, we
// write the data but no trailing 0 byte.
const unsigned long length = strlen(item);
serialize(length, out);
out.write(item, length);
}
// ----------------------------------------------------------------------------------------
class proxy_serialize
......@@ -1302,6 +1313,24 @@ namespace dlib
return *this;
}
template <size_t length>
proxy_serialize& operator<<(const char (&item)[length])
{
// We serialize char arrays like we do all other arrays. That is, we write
// every element.
serialize(length, *fout);
fout->write(item, length);
return *this;
}
proxy_serialize& operator<<(const char* item)
{
// We serialize literal strings the same way we serialize std::string, that is,
// we write the data but no trailing 0 byte.
serialize(item, *fout);
return *this;
}
private:
shared_ptr<std::ofstream> fout;
};
......
......@@ -940,6 +940,58 @@ namespace
}
}
// ----------------------------------------------------------------------------------------
void test_strings()
{
string str1 = "stuff";
char buf[6];
buf[0] = 0;
buf[1] = 1;
buf[2] = 2;
buf[3] = 0;
buf[4] = 3;
buf[5] = 3;
dlib::serialize("ser_test_string.dat") << str1 << buf << "morestuff";
string str2, str3;
char buf2[6];
memset(buf2,0,sizeof(buf2));
dlib::deserialize("ser_test_string.dat") >> str2 >> buf2 >> str3;
DLIB_TEST(str2 == "stuff");
DLIB_TEST(str3 == "morestuff");
DLIB_TEST(buf2[0] == 0);
DLIB_TEST(buf2[1] == 1);
DLIB_TEST(buf2[2] == 2);
DLIB_TEST(buf2[3] == 0);
DLIB_TEST(buf2[4] == 3);
DLIB_TEST(buf2[5] == 3);
ofstream fout("ser_test_string.dat", ios::binary);
dlib::serialize(str1, fout);
dlib::serialize(buf, fout);
dlib::serialize("morestuff", fout);
fout.close();
ifstream fin("ser_test_string.dat", ios::binary);
memset(buf2,0,sizeof(buf2));
str2.clear();
str3.clear();
dlib::deserialize(str2, fin);
dlib::deserialize(buf2, fin);
dlib::deserialize(str3, fin);
DLIB_TEST(str2 == "stuff");
DLIB_TEST(str3 == "morestuff");
DLIB_TEST(buf2[0] == 0);
DLIB_TEST(buf2[1] == 1);
DLIB_TEST(buf2[2] == 2);
DLIB_TEST(buf2[3] == 0);
DLIB_TEST(buf2[4] == 3);
DLIB_TEST(buf2[5] == 3);
}
// ----------------------------------------------------------------------------------------
class serialize_tester : public tester
......@@ -966,6 +1018,7 @@ namespace
test_vector<int>();
test_vector_bool();
test_array2d_and_matrix_serialization();
test_strings();
}
} a;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment