• <i id='gFwZw'><tr id='gFwZw'><dt id='gFwZw'><q id='gFwZw'><span id='gFwZw'><b id='gFwZw'><form id='gFwZw'><ins id='gFwZw'></ins><ul id='gFwZw'></ul><sub id='gFwZw'></sub></form><legend id='gFwZw'></legend><bdo id='gFwZw'><pre id='gFwZw'><center id='gFwZw'></center></pre></bdo></b><th id='gFwZw'></th></span></q></dt></tr></i><div id='gFwZw'><tfoot id='gFwZw'></tfoot><dl id='gFwZw'><fieldset id='gFwZw'></fieldset></dl></div>

      <small id='gFwZw'></small><noframes id='gFwZw'>

        <bdo id='gFwZw'></bdo><ul id='gFwZw'></ul>

    1. <legend id='gFwZw'><style id='gFwZw'><dir id='gFwZw'><q id='gFwZw'></q></dir></style></legend>
    2. <tfoot id='gFwZw'></tfoot>

        C++中如何实现序列化

        时间:2023-10-06

        <i id='IhNF5'><tr id='IhNF5'><dt id='IhNF5'><q id='IhNF5'><span id='IhNF5'><b id='IhNF5'><form id='IhNF5'><ins id='IhNF5'></ins><ul id='IhNF5'></ul><sub id='IhNF5'></sub></form><legend id='IhNF5'></legend><bdo id='IhNF5'><pre id='IhNF5'><center id='IhNF5'></center></pre></bdo></b><th id='IhNF5'></th></span></q></dt></tr></i><div id='IhNF5'><tfoot id='IhNF5'></tfoot><dl id='IhNF5'><fieldset id='IhNF5'></fieldset></dl></div>

              <bdo id='IhNF5'></bdo><ul id='IhNF5'></ul>

                  <tbody id='IhNF5'></tbody>
                  <legend id='IhNF5'><style id='IhNF5'><dir id='IhNF5'><q id='IhNF5'></q></dir></style></legend>

                  <tfoot id='IhNF5'></tfoot>
                • <small id='IhNF5'></small><noframes id='IhNF5'>

                  本文介绍了C++中如何实现序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  每当我发现自己需要在 C++ 程序中序列化对象时,我就会回到这种模式:

                  Whenever I find myself needing to serialize objects in a C++ program, I fall back to this kind of pattern:

                  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 是邪恶的,是一种反模式;在 C++ 中处理序列化的标准 OO 方式是什么?

                  The above works pretty well in practice. However, I've heard that this kind of switching over class IDs is evil and an antipattern; what's the standard, OO-way of handling serialization in C++?

                  推荐答案

                  使用类似 Boost Serialization 虽然绝不是标准,但(在大多数情况下)是一个编写得非常好的库,可以为您完成繁重的工作.

                  Using something like Boost Serialization, while by no means a standard, is a (for the most part) very well written library that does the grunt work for you.

                  上次我必须手动解析带有清晰继承树的预定义记录结构时,我最终使用了 带有可注册类的工厂模式(即使用键映射到(模板)创建者函数而不是大量开关函数)来尝试避免您遇到的问题.

                  The last time I had to manually parse a predefined record structure with a clear inheritance tree, I ended up using the factory pattern with registrable classes (i.e. Using a map of key to a (template) creator function rather than a lot of switch functions) to try and avoid the issue you were having.

                  编辑
                  上一段提到的对象工厂的基本 C++ 实现.

                  EDIT
                  A basic C++ implementation of a object factory mentioned in the above paragraph.

                  /**
                  * A class for creating objects, with the type of object created based on a key
                  * 
                  * @param K the key
                  * @param T the super class that all created classes derive from
                  */
                  template<typename K, typename T>
                  class Factory { 
                  private: 
                      typedef T *(*CreateObjectFunc)();
                  
                      /**
                      * A map keys (K) to functions (CreateObjectFunc)
                      * When creating a new type, we simply call the function with the required key
                      */
                      std::map<K, CreateObjectFunc> mObjectCreator;
                  
                      /**
                      * Pointers to this function are inserted into the map and called when creating objects
                      *
                      * @param S the type of class to create
                      * @return a object with the type of S
                      */
                      template<typename S> 
                      static T* createObject(){ 
                          return new S(); 
                      }
                  public:
                  
                      /**
                      * Registers a class to that it can be created via createObject()
                      *
                      * @param S the class to register, this must ve a subclass of T
                      * @param id the id to associate with the class. This ID must be unique
                      */ 
                      template<typename S> 
                      void registerClass(K id){ 
                          if (mObjectCreator.find(id) != mObjectCreator.end()){ 
                              //your error handling here
                          }
                          mObjectCreator.insert( std::make_pair<K,CreateObjectFunc>(id, &createObject<S> ) ); 
                      }
                  
                      /**
                      * Returns true if a given key exists
                      *
                      * @param id the id to check exists
                      * @return true if the id exists
                      */
                      bool hasClass(K id){
                          return mObjectCreator.find(id) != mObjectCreator.end();
                      } 
                  
                      /**
                      * Creates an object based on an id. It will return null if the key doesn't exist
                      *
                      * @param id the id of the object to create
                      * @return the new object or null if the object id doesn't exist
                      */
                      T* createObject(K id){
                          //Don't use hasClass here as doing so would involve two lookups
                          typename std::map<K, CreateObjectFunc>::iterator iter = mObjectCreator.find(id); 
                          if (iter == mObjectCreator.end()){ 
                              return NULL;
                          }
                          //calls the required createObject() function
                          return ((*iter).second)();
                      }
                  };
                  

                  这篇关于C++中如何实现序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:序列化包含 std::string 的类 下一篇:提升 C++ 序列化开销

                  相关文章

                  最新文章

                • <tfoot id='I6wKF'></tfoot>

                  <i id='I6wKF'><tr id='I6wKF'><dt id='I6wKF'><q id='I6wKF'><span id='I6wKF'><b id='I6wKF'><form id='I6wKF'><ins id='I6wKF'></ins><ul id='I6wKF'></ul><sub id='I6wKF'></sub></form><legend id='I6wKF'></legend><bdo id='I6wKF'><pre id='I6wKF'><center id='I6wKF'></center></pre></bdo></b><th id='I6wKF'></th></span></q></dt></tr></i><div id='I6wKF'><tfoot id='I6wKF'></tfoot><dl id='I6wKF'><fieldset id='I6wKF'></fieldset></dl></div>
                • <small id='I6wKF'></small><noframes id='I6wKF'>

                    <bdo id='I6wKF'></bdo><ul id='I6wKF'></ul>

                    <legend id='I6wKF'><style id='I6wKF'><dir id='I6wKF'><q id='I6wKF'></q></dir></style></legend>