【发布时间】:2012-11-06 20:36:13
【问题描述】:
我有一个简单的类,其中包含一个动态分配的数组,我需要对其进行序列化,以便将其存储在二进制文件中。由于数组的原因,我不能使用 sizeof(MyClass) 来简单地分配缓冲区。
类如下所示:
class ReplayFrame
{
public:
// ...
private:
int dataType_;
int timeStamp_;
int frameNumber_;
size_t dataSize_;
char* data_;
};
这是我想出的一个解决方案:
std::ostream& operator<< (std::ostream& out, const ReplayFrame& frame)
{
out.write((char *) &frame.dataType_, sizeof(int));
out.write((char *) &frame.timeStamp_, sizeof(int));
out.write((char *) &frame.frameNumber_, sizeof(int));
out.write((char *) &frame.dataSize_, sizeof(size_t));
out.write(frame.data_, frame.dataSize_);
return out;
}
这对我来说似乎很好,但它在某种程度上改变了 std::ostream& ReplayFrame::serialize(std::ostream& out, const ReplayFrame& frame) 这样的东西会更好?
或者我应该有一个serialize() 方法,它不使用流,而是返回大小和指向序列化对象的指针,然后我自己编写,例如:
ReplayFrame replayFrame;
int size;
char *frameSerialized = replayFrame.serialize(size);
fileStream.write(frameSerialized, size);
delete frameSerialized; // or frameSerialized.release() ?
如您所见,我很困惑,所以我愿意接受任何好的建议。 (注意:我使用的是 Qt,没有 boost,也没有 c++11)。
【问题讨论】:
-
我认为,
<<+ostream保留用于文本表示。对于序列化,我可能只使用serialize方法。 -
你也许不应该依赖
sizeof,因为有一天你的类可能会更改为包含动态分配的内存(例如,std::string)
标签: c++ serialization operator-overloading class-design iostream