c++ - 使用 Boost::Serialization 序列化带有 std::mt19937_64 成员的类

标签 c++ serialization random boost stl

给定类定义

class Example {
    std::mt19937_64 rng_;
;}

如何使用Boost对其进行序列化?我试过了

class Example { 
    std::mt19937_64 rng_;
    template <class Archive> void save(Archive& ar, const unsigned int version) const {
        ar << rng_;
    }

    template <class Archive> void load(Archive& ar, const unsigned int version) {
        ar >> rng_;
    }
    BOOST_SERIALIZATION_SPLIT_MEMBER();
;}

但它不起作用 - rng_ 成员的状态不会从存档中读回。

最佳答案

我的评论:

Well. That's obviously not implemented. What gave you the impression that it would be, anyways?

当然,这只是回避问题。给你:

namespace boost { namespace serialization {
#define MT_TPARAMS typename UIntType, size_t w, size_t n, size_t m, size_t r, UIntType a, size_t u, UIntType d, size_t s, UIntType b, size_t t, UIntType c, size_t l, UIntType f
#define MT_TARGLIST UIntType, w, n, m, r, a, u, d, s, b, t, c, l, f

    template<typename Ar, MT_TPARAMS>
    void load(Ar& ar, std::mersenne_twister_engine<MT_TARGLIST>& mt, unsigned) {
        std::string text;
        ar & text;
        std::istringstream iss(text);

        if (!(iss >> mt))
            throw std::invalid_argument("mersenne_twister_engine state");
    }

    template<typename Ar, MT_TPARAMS>
    void save(Ar& ar, std::mersenne_twister_engine<MT_TARGLIST> const& mt, unsigned) {
        std::ostringstream oss;
        if (!(oss << mt))
            throw std::invalid_argument("mersenne_twister_engine state");
        std::string text = oss.str();
        ar & text;
    }

    template<typename Ar, MT_TPARAMS>
    void serialize(Ar& ar, std::mersenne_twister_engine<MT_TARGLIST>& mt, unsigned version) {
        if (typename Ar::is_saving())
            save(ar, mt, version);
        else
            load(ar, mt, version);
    }

#undef MT_TPARAMS
#undef MT_TARGLIST

} }

参见 Live On Coliru

打印:

22 serialization::archive 15 0 0 0 0 6341 5489 13057201162865595358 10476979627314799022 15076282145854160703 4028258760921719184 16400131027729929813 681049467949274916 1166424544479915355 12669671669325274631 3923681680445358570 10843524099671305260 9320087349666649633 18036750184230437171 15162073532206564733 6406996757156837684 8927855092125653344 7287101680298317085 14285962336228661757 16767098162355983288 3083970833968823538 16292429955202811038 2462140788281684654 14987206012938009260 1755961132248244698 11853308388629125482 15567715879394119521 12922380697022943828 10568493380422968121 6468114481096881787 6912714088192792975 11676810063224680468 7989628851951361533 9980521080467753324 11628798235400288887 3042835494701912499 10149139922063010202 258211445411067868 12292608484108957137 5167437948048335677 11526653342107776435 9186605994989076293 4106436007230823197 1482400223179564867 18329651462931014642 12828698185960104073 9435381729478913436 10988179007923054324 16279301207772373869 213769070704315526 2960748844084063679 10067976150718286789 9138367034755369774 13806268603918059639 1680185388186896326 10291061633078204420 14465151537550734149 15488623881140223366 3741484074564668314 1918677755306815564 7317293401479426455 4481774452245242266 13177439052661313103 14190197572724422343 11391962132027874483 14461854875984255581 78864998355633351 13375647221931413565 13091373515385904214 6049165922138400520 11416142809731847130 18197073924412990782 829354708239552256 7594476051345711944 10772269459197422366 9316238444709656630 820820292010192239 10370107716384591311 8321593491012460630 9226632414975219865 1121855342335555726 2523212579397444422 15150453816516406687 4357348246254069950 1475811360713763769 14612290868631353049 13002835200640305831 8841644283678816855 9422668006636366709 9762262470164229443 15759907042128835526 5472764997485778171 7662827925729932877 17501417670658457528 3930325588003666236 5474808447603626986 6720003803709822382 1855653125818638627 17923060195536629896 1006421872699162065 8593337867538992416 4799988366622961201 13724225912419217109 11153468036382729521 3227521569234212702 14253271084513918446 12720552637491820050 3131078640163418426 13204035025191316893 1242013424098797151 10309732291143311392 14812467554029601896 6588807180369779774 15873501535677970563 11172284785033359089 12301618027847470633 11068608208873034498 11428326129399486324 5094087545013561907 500288200114796864 2634392864069587127 10024792545775434147 10356221529759776966 11136380342514802414 340782545860183031 7508198866667469799 7289875136835936747 17690097813874199712 2626238110689777190 16717695660713672494 3595834123325255274 6135238878624366372 9938504311934907652 11347072173565906066 9372835856550536661 2901728271276724305 9858149244111900100 16544617798517122646 11622889926249457786 9979924837559772578 14196945190861012395 2223272152803307284 5190516807419032337 3235768569839659614 7682633656132343061 13733309948923027732 16911272487285603183 16702635121049437838 6161415984776321628 12717629078983493101 2358424909955325080 12297813174132617038 9911119942162973939 14656296979938373109 5179190586448371415 11090893096306857528 11656051587341971149 2619718836853156863 167424595420134768 1643007456521706830 4530990928200931669 4691242637059006353 3245172607167855857 3826074447196161535 3017613396914933622 17340905364626031202 7485046344904985266 4965505580881047325 7607870693563722899 7474217805999604818 9839820025668071488 3904404505428916804 9096143925090925215 11720022622728597618 14607455239072224349 9652489256075507508 16157915074085584685 8844691517984910790 4655454640787506604 13027405036051698459 7614616053181367064 7581798355918172953 15422484141350085613 7273144328931681164 4809879802957181824 8173340538785729893 8978995124845705037 1098023286586191126 3673056527006128025 10771848665549917601 2556126669642826596 5853974322212222290 4132488280061906262 7632389934273528542 9864709072803865332 1026796482661462016 1419617114693595331 3962155586201817099 667987996344895412 8873514502505981802 651162605589119894 17797581581324995622 15976116878184660554 612180284401625759 5667627227252711358 10804568037840393823 13480141817918853670 1066512862997122338 3604813770717933001 13585907467660805157 205740876326491308 5991394416108877582 14926153760506158966 1763245647862174565 7472896455769818262 1880205322011031649 4964758817614792932 9867509509583481881 10312058868395878040 17252972030239322092 2606539039210012382 12769631308639825890 13775140203463199549 11099918903372708849 13347825623771273110 10911113188423225828 3460604650247618639 18367317190899220421 8882227645936398513 17724301884678217684 5689627886741111472 9758983823681554691 4544309240290776340 11463612010490044780 1863376090611217215 15532585436324660221 2614370430655215249 8917872921271699305 6432650944098428469 2156285533792683026 16620843026246231577 7840248012245686658 8817762536320809464 11411624210052135095 14469479953922933700 7687504684721677295 3569379597009150923 16298388750432321701 3546604078275180581 14090163417090112121 1483598196549275243 842296961800625865 3395823622991339856 2860049050133253132 15982791582006104857 2089985782673048208 16970930680417346639 5169822013739423324 10286951961495655002 2382826956176138874 16598361065592133237 17932005381186616770 16288375750215523058 10795004077740592227 8767132529733815572 56240711443019961 16559497623279599758 110008580074802387 11565107589793869602 8340806487881443756 15870344620874033014 11296081153908292511 7302467602367798952 67243528223816645 3486356707203513778 12062986918467299164 819578200798056089 18327439140423416057 14368763774382050055 15153510095141989578 3341425261026301804 773058210352526100 8392504547028739997 16740785353247611782 3373348860032225916 2701382140093875432 6671463639189304805 2761278783662691890 4685122996515124713 2654082339795866344 11329882967399066601 15952333297690283633 1697237544920553773 12370315011795239181 12798146676828103112 6070340910131537832 1447608530827808988 10598487560452381652 9074424128904564679 10368088978608816376 14242160977535644445 10536783946433683314 9271707826703226845 16651953013385761889 17192290660721538153 3817850688440651218 12138791431534730523 15752446791766328727 13797089951075641399 3884892512265821573 13501119693269626006 6429997517378945850 14292992949928449942 312

关于c++ - 使用 Boost::Serialization 序列化带有 std::mt19937_64 成员的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45871933/

相关文章:

c++ - 是否存在与用于 Java 的 Google Gson/XStream 一样简单的 C++ 序列化库?

c++ - 关于指针的一些问题

c++ - boost::function 和 std::tr1::function 之间是否有重要区别需要了解

c++ - 音频采样频率音高

java - 为什么 Serialized 被称为接口(interface)?

c# - 使用 C# 将非常大的项目列表序列化到 Azure blob 存储中

algorithm - 随机数算法的随机性

sql - 为什么此 SQL Case 语句在某些情况下返回 null?

c - 为什么这段代码要调用 rand() 两次才能获得至少 N 个随机位?

c++ - 读取 OpenCV Mat 16bit 到 QImage 8bit Greyscale