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 중국어 웹사이트의 기타 관련 기사를 참조하세요!