C++ 如何将serialize方法添加到作为Windows数据结构的类成员中,以便在C++;

C++ 如何将serialize方法添加到作为Windows数据结构的类成员中,以便在C++;,c++,serialization,boost,C++,Serialization,Boost,我在网上搜索过,似乎找不到关于这件事的明确答案。基本上,我有一个类,其中一些成员是Windows定义的数据结构。例如,SYSTEMTIME是其中一个成员的类型。根据boost文档,我已经在类定义中添加了serialize方法等。它可以很好地编译,而不需要更复杂的Windows数据类型(例如BOOL、primitives等)。如果添加它们,我会收到一条错误消息,如“…serialize不是SYSTEMTIME的成员…”。我尝试了传递SYSTEMTIME参数的“不引人注目”序列化方法。我甚至尝试用添

我在网上搜索过,似乎找不到关于这件事的明确答案。基本上,我有一个类,其中一些成员是Windows定义的数据结构。例如,SYSTEMTIME是其中一个成员的类型。根据boost文档,我已经在类定义中添加了serialize方法等。它可以很好地编译,而不需要更复杂的Windows数据类型(例如BOOL、primitives等)。如果添加它们,我会收到一条错误消息,如“…serialize不是SYSTEMTIME的成员…”。我尝试了传递SYSTEMTIME参数的“不引人注目”序列化方法。我甚至尝试用添加的序列化方法重新定义整个结构。在这种情况下,我收到了一个重新定义错误

我知道类或结构类型的成员需要自己的序列化方法,以及在调用包含类的序列化方法时如何调用该方法,但似乎不知道如何为我未定义的类型执行此操作。我是新来的boost,我在这里有点迷茫,任何关于这个主题的帮助都将不胜感激

提前谢谢

编辑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;
            }
        }
    } 
namespace boost{
命名空间序列化{
样板
无效序列化(存档和ar、系统时间和st、常量未签名整数版本){
ar&st.wYear;
ar&st.W月;
ar&st.wDayOfWeek;
ar&st.wDay;
ar&st.wHour;
ar&st.W分钟;
ar&st.wssecond;
ar&st.wmills;
}
}
} 
并收到错误序列化不是_SYSTEMTIME的成员。我刚刚又试了一次,它被编译了,嗯,我会测试一下它是否有效,然后再发布。

我说不出你“做错了”什么,但这里有证据证明它有效

查看它

与输出

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
代码:

#包括
typedef uint32_t字;
类型定义结构\u系统时间{
单词wYear;
单词wmmonth;
单词wDayOfWeek;
单词wDay;
单词wHour;
单词wMinute;
单词wssecond;
单词wmill秒;
}系统时间,*PSYSTEMTIME;
命名空间boost{命名空间序列化{
样板
无效序列化(存档和ar、系统时间和st、常量未签名整数版本){
ar&st.wYear;
ar&st.W月;
ar&st.wDayOfWeek;
ar&st.wDay;
ar&st.wHour;
ar&st.W分钟;
ar&st.wssecond;
ar&st.wmills;
}
} }
int main()
{
boost::archive::text\u oarchive oa(std::cout);
系统时间d{1,2,3,4,5,6,7,8};
我不知道你做错了什么,但这里有证据证明它是有效的

查看它

与输出

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
代码:

#包括
typedef uint32_t字;
类型定义结构\u系统时间{
单词wYear;
单词wmmonth;
单词wDayOfWeek;
单词wDay;
单词wHour;
单词wMinute;
单词wssecond;
单词wmill秒;
}系统时间,*PSYSTEMTIME;
命名空间boost{命名空间序列化{
样板
无效序列化(存档和ar、系统时间和st、常量未签名整数版本){
ar&st.wYear;
ar&st.W月;
ar&st.wDayOfWeek;
ar&st.wDay;
ar&st.wHour;
ar&st.W分钟;
ar&st.wssecond;
ar&st.wmills;
}
} }
int main()
{
boost::archive::text\u oarchive oa(std::cout);
系统时间d{1,2,3,4,5,6,7,8};

oa我会遵循非侵入式(我认为这比“不引人注目”更合适,但我必须查找其含义以了解差异!顺便说一句,我认为您可能会将非侵入式方法描述得有点突兀,因为您必须添加序列化方法的全局重载…)接近,我自己。你能发布你尝试此操作时收到的错误消息吗?@Aaron谢谢你的快速回复。我想我指的是非突兀,因为我不知道有什么不同。我首先尝试添加:@Aaron抱歉,评论打断了我,我在上面编辑了帖子,我会遵循非突兀的方式(我认为这比“不引人注目”更合适,但我必须查找其含义以了解差异!顺便说一句,我认为您可能会将非侵入式方法描述得稍微突出一些,因为您必须添加序列化方法的全局重载…)接近,我自己。你能发布你尝试此操作时收到的错误消息吗?@Aaron谢谢你的快速回复。我想我指的是不突兀,因为我不知道有什么不同。我首先尝试添加:@Aaron抱歉,评论打断了我,我编辑了上面的帖子谢谢你的测试。我相信问题是我最初将SYSTEMTIME参数设置为常量(我想我在某处看到一个这样做的示例…)。一旦删除,它就会被编译。@Paul是的,这将是一个问题。您可以将其设置为常量以进行输出序列化,请参见链接:)很酷,谢谢!我仍然对如何在类上下文中执行此操作感到有点困惑(例如,作为成员类型的SYSTEMTIME)。我是否会像我所做的那样,同时也对类执行?添加类似于
code
namespace boost{…与上面相同的代码…序列化(归档&ar,ClassName&obj,const unsigned int version)ar&SYSTEMTIME membername;ar和其他成员…}
code
调用时,SYSTEMTIME成员将引用单独的序列化方法…?@Paul简单地说:是的。我可以补充一点,您可以自由使用“侵入式”(成员)样式序列化钩子,如果您愿意的话。混合和匹配没有问题。感谢您的测试。我相信问题在于我将SYSTEMTIME参数设置为常量I