Serialization with Factory Pattern in C
This article discusses serialization in C and provides alternative approaches to the commonly used class ID switching pattern.
Problem:
The classical C serialization pattern involves switching over class IDs to deserialize objects. However, this approach is often considered an antipattern due to its potential for error-proneness and maintenance complexity.
Solution 1: Boost Serialization
Boost Serialization is a third-party library that simplifies serialization by automating the grunt work. It provides efficient and reliable methods for serializing and deserializing objects.
Solution 2: Factory Pattern with Registrable Classes
An alternative to class ID switching is to use a factory pattern with registrable classes. Here's a basic implementation in C :
<code class="cpp">template<typename K, typename T> class Factory { private: typedef T* (*CreateObjectFunc)(); std::map<K, CreateObjectFunc> mObjectCreator; public: template<typename S> void registerClass(K id) { mObjectCreator.insert(std::make_pair<K, CreateObjectFunc>(id, &createObject<S>)); } bool hasClass(K id) { return mObjectCreator.find(id) != mObjectCreator.end(); } T* createObject(K id) { typename std::map<K, CreateObjectFunc>::iterator iter = mObjectCreator.find(id); if (iter == mObjectCreator.end()) { return NULL; } return ((*iter).second)(); } };</code>
This approach allows for registering classes and creating objects dynamically, avoiding the need for manual class ID switching.
The above is the detailed content of How to Avoid Class ID Switching in C Serialization?. For more information, please follow other related articles on the PHP Chinese website!