当面对 C 中的对象序列化需求时,许多人采用一种熟悉的模式,涉及基于类 ID 的切换:
<code class="cpp">class Serializable { public: static Serializable *deserialize(istream &is) { int id; is >> id; switch(id) { case EXAMPLE_ID: return new ExampleClass(is); //... } } void serialize(ostream &os) { os << getClassID(); serializeMe(os); } protected: int getClassID()=0; void serializeMe(ostream &os)=0; };
虽然这种方法看起来很直观,但它存在潜在的陷阱:
工厂模式方法
一种更优雅和可扩展的方法解决方案是采用工厂模式。工厂类不依赖类 ID,而是根据一组已注册的键函数对创建对象。这些函数返回相应类的实例。
<code class="cpp">template<typename K, typename T> class Factory { typedef T *(*CreateObjectFunc)(); std::map<K, CreateObjectFunc> mObjectCreator; template<typename S> static T* createObject(){ return new S(); } template<typename S> void registerClass(K id){ mObjectCreator.insert( std::make_pair<K,CreateObjectFunc>(id, &createObject<S> ) ); } T* createObject(K id){ typename std::map<K, CreateObjectFunc>::iterator iter = mObjectCreator.find(id); if (iter == mObjectCreator.end()){ return NULL; } return ((*iter).second)(); } };</code>
在此实现中,每个感兴趣的类都向工厂注册,将其类 ID 与创建函数相关联。当要反序列化对象时,会在工厂中查询相应的类 ID。如果找到,则调用创建函数来实例化该对象。
以上是如何使用工厂模式在 C 中优雅地将类序列化为流?的详细内容。更多信息请关注PHP中文网其他相关文章!