• 应用boost库serialize标准库里的map


    需求,最近做ios程序,需要将用户密码和帐号保存到本地磁盘,而用用户不止一个,想到boost库里的serialization比较适合,用户就用标准库里的map来保存,也就是std::map<std::string, std::string>,代码如下:

    UserInfo.h:

    //
    //  UserInfo.h
    //  app1
    //
    //  Created by xp y on 12-8-23.
    //  Copyright (c) 2012年 xp y. All rights reserved.
    //

    #ifndef __app1__UserInfo__
    #define __app1__UserInfo__
    #import <map>
    #import <string>
    #import <fstream>
    #import <boost/archive/binary_iarchive.hpp>
    #import <boost/archive/binary_oarchive.hpp>
    #import <boost/serialization/map.hpp>
    #include <iostream>

    //  use this to ease the archive selection
    typedef boost::archive::binary_iarchive iarchive;
    typedef boost::archive::binary_oarchive oarchive;

    class UserInfo
    {
       
        friend class boost::serialization::access;
       
        protected :
       
        template <class Archive>
        void  serialize(Archive& ar,  const unsigned int   /*  file_version  */ );
       
        public :
       
        std::map<std::string, std::string> users;
        void setData();
        void showData();
        static void saveData(const std::map<std::string, std::string>& obj, std::string fileName)
        {
            std::ofstream ofs(fileName.c_str());
            oarchive oa(ofs);
            oa  <<  obj;
        }
       
        static void loadData(std::map<std::string, std::string>& obj, std::string fileName)
        {
            std::ifstream ifs(fileName.c_str());
            iarchive ia(ifs);
            ia >> obj;
        }
       
        UserInfo();
        virtual ~UserInfo();
    };

    #endif /* defined(__app1__UserInfo__) */

    UserInfo.mm:

    #include "UserInfo.h"
    #import <map>
    #import <string>

    template <class Archive>
    void  UserInfo::serialize(Archive& ar,  const unsigned int   /*  file_version  */ )
    {
        ar & users;
    }

    void UserInfo::setData() {   
       
        users["aa"] = "hello";
        users["bb"] = "good";
    }
       
    void UserInfo::showData() {
        std::map<std::string, std::string>::iterator it = users.begin();
        std::cout << it->first << ":" << it->second << "\n";
        ++it;
        std::cout << it->first << ":" << it->second << "\n";
    }

    调用代码:

    UserInfo u,u2;
    u.mInt  =   3 ;
    u.setData();
       
    UserInfo::saveData(u.users, "/Users/leejinchen/Downloads/output.txt");
    UserInfo::loadData(u2.users, "/Users/leejinchen/Downloads/output.txt");
    u2.showData();

    输出:

    aa:hello
    bb:good

    注意一定要包含

    #import <boost/serialization/map.hpp>,否则会报类似以下错误:

    error C2039: 'serialize' : is not a member of 'stdext::map<_Kty,_Ty>'
    原因是因为序列化的是map类型,内部是多个键值对,如果序列化非集合类型应该不会出现这种错误 ,
    如果你序列化的是其他的集合类型,可以到boost/serialization/下对应的头文件,除此外还要加上链接库
    libboost_serialization-xgcc42-d-1_49.a,xcode里是在targets>>build phases>>link binary with libraries
    根据平台和版本的不同,
    xgcc42-d-1_49是会变化的
  • 相关阅读:
    高精度
    SPOJ 3267(DQUERY) D-query 【主席树】【离线树状数组】
    POJ 3225 Help with Intervals 【线段树】
    HDU 4288 Coder 【线段树】
    HDU 1542 Atlantis 【线段树+扫描线】
    Codeforces 732D Exams【二分+贪心】
    HDU 2795 Billboard 【线段树】
    2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest Problem J 【二分+DP+单调队列】
    HDU 5521 Meeting 【拆点+最短路】
    POJ 3255 Roadblocks 【次短路】
  • 原文地址:https://www.cnblogs.com/yuanxiaoping_21cn_com/p/2653300.html
Copyright © 2020-2023  润新知