【发布时间】:2014-09-14 17:54:36
【问题描述】:
假设我们有一个复杂(即非原始)类ComplexObject 定义如下:
class A{...};
class B{...};
class C{...};
class ComplexObject
{
private:
A _fieldA;
B _fieldB;
C _fieldC;
};
我想实现一个序列化程序,将ComplexObject 的实例序列化为二进制形式。根据我在 C# 方面的经验,我基本上看到了 3 种不同的方式来实现序列化程序。
- 在
ComplexObject和“子”类A、B和C的定义中定义一个serialize(binarystream&)方法。ComplexObject中定义的serialize方法将递归调用子成员的方法。 - 创建一个单独的类,其中包含用于序列化每个
ComplexObject、A、B和C的方法。用于序列化ComplexObject的方法将递归调用子成员的方法。当然,必须在类中定义 getter 才能为序列化程序检索私有字段。 - 使用反射生成对象的模板,并根据生成的模板将所有可序列化的字段写入表中。
不幸的是,我认为反射在 C++ 中将非常难以使用,因此我将远离第三种选择。我已经看到选项 1 和 2 都经常使用(在 C# 中)。
选项 1 相对于选项 2 的一个优势是它允许从 ComplexObject 派生的类,方法是将 serilalize(binarystream&) 方法标记为虚拟。但是,它会添加到对象的成员函数列表中并使程序员感到困惑。您没有看到在 std::string 中定义了 serialize 方法,是吗?
另一方面,选项 2 取出所有序列化方法并将其组合在一起以使事情更整洁。但是,我认为要适应 ComplexObject 的派生类并不容易。
在什么情况下应该使用每个选项(1 和 2)?
【问题讨论】:
标签: c++ class serialization polymorphism