ホームページ  >  記事  >  バックエンド開発  >  C シリアル化でクラス ID の切り替えを回避するにはどうすればよいですか?

C シリアル化でクラス ID の切り替えを回避するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-02 15:25:02376ブラウズ

How to Avoid Class ID Switching in C   Serialization?

C でのファクトリー パターンによるシリアル化

この記事では、C でのシリアル化について説明し、一般的に使用されるクラス ID スイッチング パターンの代替アプローチを提供します。

問題:

古典的な C シリアル化パターンでは、オブジェクトを逆シリアル化するためにクラス ID を切り替える必要があります。ただし、このアプローチはエラーが発生しやすく、メンテナンスが複雑になる可能性があるため、アンチパターンであると考えられます。

解決策 1: シリアル化のブースト

シリアル化のブーストは 3 番目の方法です。面倒な作業を自動化することでシリアル化を簡素化するパーティ ライブラリ。これは、オブジェクトをシリアル化および逆シリアル化するための効率的で信頼性の高い方法を提供します。

解決策 2: 登録可能なクラスを使用したファクトリ パターン

クラス ID 切り替えの代替案は、ファクトリ パターンを使用することです。登録可能なクラスあり。 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>

このアプローチにより、クラスの登録とオブジェクトの動的作成が可能になり、手動でクラス ID を切り替える必要がなくなります。

以上がC シリアル化でクラス ID の切り替えを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。