我正在使用这种方法来序列化和反序列化类层次结构:
// Enumeration of classes.
struct Type {
enum TypeEnum { A, B }
TypeEnum t;
Type(TypeEnum te) : t(te) { }
bool operator == (TypeEnum te);
void saveToStream(Stream& stream);
void loadFromStream(Stream& stream);
};
// Serializable base class.
struct A {
Type type;
A() { type = Type::A; }
// ... members
virtual void loadFromStream(Stream& stream);
virtual void saveToStream(Stream& stream) const;
};
// Serializable child class.
struct B : public A {
B() : A() { type = Type::B; }
virtual void loadFromStream(Stream& stream);
virtual void saveToStream(Stream& stream);
};
// Helper class.
struct Serializer {
static A* loadFromStream(Stream& stream)
{
Type t;
t.loadFromStream(stream);
if (t == Type::A) {
A* a = new A;
a->loadFromStream(stream);
return a;
} else if (t == Type::B) {
A* b = new B;
b->loadFromStream(stream);
return b;
}
throw "Unknown type";
return 0; // surpress warning
}
static void saveToStream(Stream& stream, const A& a)
{
a.type.saveToStream(stream);
a.saveToStream(stream);
}
};
// Usage
B b;
Serializer::saveToStream(stream, b);
B* b2 = static_cast<B*>(Serializer::loadFromStream(stream));
这种方法非常简单易懂。但是我在考虑是否有一种更优雅的解决方案,而无需在每次扩展类层次结构时都更新
Type
类。如果没有枚举器类
Type
甚至没有Serializer
类,您是否有任何提示? 最佳答案
这似乎是Factory Pattern的不错候选人。
基本上,它包括委派基于给定标识符实例化正确类型的职责。在Stack Overflow上进行的搜索显示了this answer,它提供了一个用C++实现的很好的例子。请注意,工厂可以创建的所有对象都必须实现一个公共(public)接口(interface)(这似乎是您的情况)。
一旦实现了这种模式,就可以删除if
中的else if
/ Serializer::loadFromStream
级联,而只需在工厂实例化对象上调用loadFromStream
。
关于c++ - 如何在没有类枚举器的情况下反序列化类层次结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4240138/