Как добавить метод сериализации к члену класса, который представляет собой структуру данных Windows для использования с последовательностью форсирования в С++

Я искал в Интернете и, похоже, не нашел четкого ответа на этот вопрос. В принципе, у меня есть класс с некоторыми членами, которые представляют собой структуры данных, определенные Windows. Например, SYSTEMTIME является типом одного из членов. Я добавил метод сериализации и т.д. К определению класса в документации для повышения. Он отлично компилируется без более сложных типов данных Windows (например, BOOL, примитивы и т.д.). Если я их добавлю, я получаю сообщение об ошибке типа "... serialize не является членом 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;
 }
 }
 } 
</typename>

и полученная сериализация ошибки не является членом _SYSTEMTIME. Я просто попробовал еще раз, и это скомпилировано, хмммм, я буду проверять, будет ли это работать и публиковать снова.

1 ответ

Я не могу сказать, что вы сделали "неправильно", но здесь доказательство того, что оно работает.

Смотрите онлайн Live на 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 ******** 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;
}
</typename></boost>

licensed under cc by-sa 3.0 with attribution.