如何将序列化方法添加到作为 Windows 数据结构的类成员,以便在 C++ 中与 boost 序列化一起使用

Posted

技术标签:

【中文标题】如何将序列化方法添加到作为 Windows 数据结构的类成员,以便在 C++ 中与 boost 序列化一起使用【英文标题】:How can you add a serialize method to a class member that is a Windows data struct for use with boost serialization in C++ 【发布时间】:2014-01-07 21:11:50 【问题描述】:

我在网上搜索过,似乎无法找到关于这个问题的明确答案。基本上,我有一个类,其中一些成员是 Windows 定义的数据结构。例如,SYSTEMTIME 是成员之一的类型。根据 boost 文档,我已将 serialize 方法等添加到类定义中。它编译良好,无需更复杂的 Windows 数据类型(例如 BOOL、原语等工作正常)。如果我添加它们,我会收到一条错误消息,例如“... serialize is not a member of SYSTEMTIME ...”。我尝试了传递 SYSTEMTIME 参数的“不显眼”序列化方法。我什至尝试使用添加的序列化方法重新定义整个结构。在这种情况下,我收到了重新定义错误。

我了解类或结构类型的成员需要自己的序列化方法以及在调用包含类的序列化方法时如何调用它,但似乎无法弄清楚如何为我所做的类型执行此操作不定义。我是新手,在这里我有点迷路,对此主题的任何帮助将不胜感激。

提前致谢。

编辑 1:

我想我指的是不突兀,因为我不知道有区别。我首先尝试添加:

    namespace boost 
        namespace serialization 
            template<typename Archive>
            void serialize( Archive& ar, SYSTEMTIME& st, const unsigned int version ) 
                ar & st.wYear;
                ar & st.wMonth;
                ar & st.wDayOfWeek;
                ar & st.wDay;
                ar & st.wHour;
                ar & st.wMinute;
                ar & st.wSecond;
                ar & st.wMilliseconds;
            
        
     

并收到错误序列化不是_SYSTEMTIME 的成员。我刚刚又试了一下,编译成功了,嗯嗯,我试试看能不能再发帖。

【问题讨论】:

我会遵循非侵入式(我认为这比“非侵入式”更合适,但我必须查一下含义才能知道其中的区别!顺便说一句,我想你可能会描述非侵入式方法有点突兀,因为您必须添加 serialize 方法的全局重载...)方法,我自己。您可以发布您尝试此操作时收到的错误消息吗? @Aaron 感谢您的快速回复。我想我指的是不突兀,因为我不知道有区别。我首先尝试添加: @Aaron 抱歉评论打断了我,我编辑了上面的帖子 【参考方案1】:

我不知道你做错了什么,但这里有证据证明它有效。

Live on Coliru

有输出

clang++ -std=c++11 -Os -Wall -pedantic main.cpp -lboost_system -lboost_serialization && ./a.out
22 serialization::archive 10 0 0 1 2 3 4 5 6 7 8

代码:

#include <boost/archive/text_oarchive.hpp>

typedef uint32_t WORD;

typedef struct _SYSTEMTIME 
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
 SYSTEMTIME, *PSYSTEMTIME;

namespace boost  namespace serialization 
    template<typename Archive>
        void serialize(Archive& ar, SYSTEMTIME& st, const unsigned int version) 
            ar & st.wYear;
            ar & st.wMonth;
            ar & st.wDayOfWeek;
            ar & st.wDay;
            ar & st.wHour;
            ar & st.wMinute;
            ar & st.wSecond;
            ar & st.wMilliseconds;
        
 

int main()

    boost::archive::text_oarchive oa(std::cout);
    SYSTEMTIME d  1,2,3,4,5,6,7,8 ;
    oa << d;

【讨论】:

感谢您的测试。我相信问题在于我最初将 SYSTEMTIME 参数设置为 const (我想我在某处看到了一个这样做的示例......)。一旦删除,它就会编译。 @Paul 是的,这将是一个问题。您可以使用 BOOST_SERIALIZATION_SPLIT_FREE(SYSTEMTIME) 将其用于输出序列化,请参阅该链接 :) 酷,谢谢!我仍然对如何在类的上下文中执行此操作感到有些困惑(例如,SYSTEMTIME 作为成员类型)。我会做我做过的事,但也为班级做事吗?添加类似codenamespace boost ...与上面相同的代码...serialize(Archive& ar, ClassName& obj, const unsigned int version) ar & SYSTEMTIME membername; ar & 其他成员...code 和 SYSTEMTIME 成员将在调用时引用单独的序列化方法...? @Paul 简单:是的。我可以补充一点,如果您愿意,您可以随意使用“侵入式”(成员)风格的序列化挂钩。混搭没问题。

以上是关于如何将序列化方法添加到作为 Windows 数据结构的类成员,以便在 C++ 中与 boost 序列化一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Thingsboard 中的时间序列数据作为 CSV 或 JSON 文件保存到外部文件系统? [关闭]

如何将数据点添加到时间序列线图中以突出显示事件?

如何将多维数组添加到序列化的 POST 数据中?

PHP如何将数据附加到序列化数组中

如何将 Windows 终端添加到 Windows 10 上的上下文菜单? [关闭]

自订类的属性与字段如何枚举并提供控件作为系结来源?