>백엔드 개발 >C++ >팩토리 패턴을 사용하여 C에서 클래스를 스트림으로 우아하게 직렬화하는 방법은 무엇입니까?

팩토리 패턴을 사용하여 C에서 클래스를 스트림으로 우아하게 직렬화하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-29 02:45:29981검색

How to Elegantly Serialize Classes to a Stream in C   Using the Factory Pattern?

수수께기 없는 클래스를 위한 스트림 직렬화

C에서 객체 직렬화가 필요할 때 많은 사람들이 클래스 ID 기반 전환과 관련된 친숙한 패턴을 사용합니다. :

<code class="cpp">class Serializable {
  public:
    static Serializable *deserialize(istream &amp;is) {
        int id;
        is >> id;
        switch(id) {
          case EXAMPLE_ID:
            return new ExampleClass(is);
          //...
        }
    }

    void serialize(ostream &amp;os) {
        os << getClassID();
        serializeMe(os);
    }

  protected:
    int getClassID()=0;
    void serializeMe(ostream &amp;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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.