我是新手来推动序列化,但这对我来说似乎很奇怪。
我有一个非常简单的课程,有两个成员
int number // always = 123
char buffer[?] // buffer with ? size
所以有时我将大小设置为buffer[31]
然后我将类序列化
22 serialization::archive 8 0 0 1 1 0 0 0 0 123 0 0 31 0 0 0 65 65
我们可以看到123
和31
所以这里没有问题都是十进制格式。
现在我将缓冲区更改为buffer[1024]
,所以我希望看到
22 serialization::archive 8 0 0 1 1 0 0 0 0 123 0 0 1024 0 0 0 65 65 ---
这是实际结果
22 serialization::archive 8 0 0 1 1 0 0 0 0 123 0 0 0 4 0 0 65 65 65
boost仅针对缓冲区大小切换为十六进制?
注意另一个值仍为十进制。
那么如果我将数字从123切换到1024会怎样?
我会想象040?
22 serialization::archive 8 0 0 1 1 0 0 0 0 1024 0 0 0 4 0 0 65 65
如果这是设计,为什么31不能转换为1F?它不一致。
这会导致我们的split_free的加载函数出现问题,我们正在这样做
unsigned int size;
ar >> size;
但正如你可能猜到的那样,当它是040时,它会截断为零:(
建议的解决方案是什么?
我使用的是boost 1.45.0,但我在boost 1_56.0上进行了测试,结果相同。
编辑:序列化函数的样本
template<class Archive>
void save(Archive& ar, const MYCLASS& buffer, unsigned int /*version*/) {
ar << boost::serialization::make_array(reinterpret_cast<const unsigned char*>(buffer.begin()), buffer.length());
}
MYCLASS只是char *的包装器,第一个元素是unsigned int 保持长度接近UNICODE_STRING
http://msdn.microsoft.com/en-gb/library/windows/desktop/aa380518(v=vs.85).aspx
如果长度为1024或31,代码是相同的,所以我不希望这是一个问题。
答案 0 :(得分:0)
&#34;为什么31没有转换为1F?它不一致&#34; - 你的假设造成了错误的不一致。假设您实际上只是猜测时可以阅读序列化归档格式。
如果您想知道,请跟踪代码。如果没有,只需使用存档格式。
如果您想要&#34;人类可访问的表单&#34;,请考虑xml_oarchive。
答案 1 :(得分:0)
我不认为Boost&#34;切换到十六进制&#34;。老实说,我对此没有任何经验,但看起来boost是序列化为一个字节数组,只能保存0到255之间的数字.1024是一个字节值为4后跟一个字节值0。