Cereal do serializacji i deserializacji – moje metody nie działają prawidłowo

0

Witam
W firmie w której pracuje używają biblioteki cereal do serializacji i deserializacji. Z jakiegos powodu to niżej mi nie działa. Jak użyję memcpy zamiast cereala to działa tzn. metoda parse_from poprawnie uzupełni stringi path i interface z payloadu oraz metoda serialize_to poprawnie uzupełni payload ze stringów. A jak zrobić to z cerealem?
Poniżej 3-cia wersja. Pierwsza to były samy same stringi, druga to &stringi.front().

struct Struktura
{
    std::string path;    
    std::string interface;

    unsigned int byte_size() { return cereal::BinaryOutputArchive::stream_size(path.data(), interface.data()); }
    void parse_from(const void* payload, size_t size)
    {
        cereal::BinaryInputArchive ia(const_cast<void*>(payload), size);
        ia(path.data(), interface.data());
    }
    void serialize_to(void* payload, size_t size)
    {
        cereal::BinaryOutputArchive oa(payload, static_cast<uint16_t>(size));
        oa(path.data(), interface.data());
    }
};
0

Nie używałem nigdy cereala, ale jak Ty chcesz deserializować stringi poprzez podanie wskaźnika na dane pustych stringów?

1

przeczytałeś choć odrobinę dokumentację?
Pomieszałeś archiwum z danymi archiwizowanymi i nie zrobiłeś serializacji.
Wystarczy popatrzeć na przykład z pierwszej strony i widać, co powinieneś zrobić.

struct Struktura
{
    std::string path;    
    std::string interface;
 
   template <class Archive>
   void serialize( Archive & ar )
   {
       ar( path, interface);
   }
};

Struktura loadStruktura(const void* payload, size_t size)
{
    cereal::BinaryInputArchive ia(const_cast<void*>(payload), size);
    Struktura result;
    ia(result);
    return result;
}

Żeby było jasne, tobie nie zadziałało oa(path.data(), interface.data()); bo tam argumentem mają być l-value, a ty jako argument podałeś r-value.

1 użytkowników online, w tym zalogowanych: 0, gości: 1