#include <iostream>
#include <sstream>
#include <cereal/archives/json.hpp>
#include <cereal/archives/binary.hpp>
#include <string_view>
#include <format>
namespace std
{
template <typename... Args>
void println(std::string_view sv, Args&&... args)
{
std::cout << std::vformat(sv, std::make_format_args(args...)) << std::endl;
}
}
struct ChatMessage {
std::string sender;
void serialize(auto& ar) {
ar(CEREAL_NVP(sender));
}
};
static std::string getSerializedBinaryString(const ChatMessage & message) noexcept
{
std::ostringstream oss(std::stringstream::binary);
{
cereal::BinaryOutputArchive archive(oss);
archive(message);
}
return oss.str();
}
static ChatMessage getDeserializedBinaryInst(const std::string & message) noexcept
{
ChatMessage receivedMessage;
{
std::istringstream iss(message);
cereal::BinaryInputArchive archiveIn(iss);
archiveIn(receivedMessage);
}
return receivedMessage;
}
int main() {
ChatMessage message;
message.sender = "Alice";
auto serialize = getSerializedBinaryString(message);
std::println("Serialized string is {}", serialize);
auto receivedMessage = getDeserializedBinaryInst(serialize);
std::println("Sender: {}", receivedMessage.sender);
return 0;
}
When compiled with JSONInputArchive/JSONoutputArchive it compiles fine and serialize/deserialize works fine. But the same thing is not getting compiled when using BinaryInputArchive/BinaryOutputArchive.
D:/Prog/c++/cereals/main.cpp:78:16: required from 'void ChatMessage::serialize(Archive&) [with Archive = cereal::BinaryInputArchive]'
D:/Prog/c++/cereals/cereal/include/cereal/access.hpp:246:48: required from 'static decltype (t.serialize(ar)) cereal::access::member_serialize(Archive&, T&) [with Archive = cereal::BinaryInputArchive; T = ChatMessage; decltype (t.serialize(ar)) = void]'
D:/Prog/c++/cereals/cereal/include/cereal/cereal.hpp:917:33: required from 'ArchiveType& cereal::InputArchive<ArchiveType, Flags>::processImpl(T&) [with T = ChatMessage; typename cereal::traits::detail::EnableIfHelper<cereal::traits::has_member_serialize<T, ArchiveType>::value, (! cereal::traits::has_invalid_input_versioning<T, ArchiveType>::value), (cereal::traits::is_input_serializable<T, ArchiveType>::value && (cereal::traits::is_specialized_member_serialize<T, ArchiveType>::value || (! cereal::traits::is_specialized<T, ArchiveType>::value)))>::type <anonymous> = (cereal::traits::detail::sfinae)0; ArchiveType = cereal::BinaryInputArchive; unsigned int Flags = 1]'
D:/Prog/c++/cereals/cereal/include/cereal/cereal.hpp:853:26: required from 'void cereal::InputArchive<ArchiveType, Flags>::process(T&&) [with T = ChatMessage&; ArchiveType = cereal::BinaryInputArchive; unsigned int Flags = 1]'
D:/Prog/c++/cereals/cereal/include/cereal/cereal.hpp:730:16: required from 'ArchiveType& cereal::InputArchive<ArchiveType, Flags>::operator()(Types&& ...) [with Types = {ChatMessage&}; ArchiveType = cereal::BinaryInputArchive; unsigned int Flags = 1]'
D:/Prog/c++/cereals/main.cpp:102:18: required from here
D:/Prog/c++/cereals/cereal/include/cereal/cereal.hpp:985:86: error: static assertion failed: cereal could not find any input serialization functions for the provided type and archive combination.
Types must either have a serialize function, load/save pair, or load_minimal/save_minimal pair (you may not mix these).
Serialize functions generally have the following signature:
template<class Archive>
void serialize(Archive & ar)
{
ar( member1, member2, member3 );
985 | static_assert(traits::detail::count_input_serializers<T, ArchiveType>::value != 0,
| ~~~~~~^~~~
D:/Prog/c++/cereals/cereal/include/cereal/cereal.hpp:985:86: note: the comparison reduces to '(0 != 0)'
When compiled with JSONInputArchive/JSONoutputArchive it compiles fine and serialize/deserialize works fine. But the same thing is not getting compiled when using BinaryInputArchive/BinaryOutputArchive.
Any help on this is very much appreciated.
Why have you cut off the first error line? Why have you posted not the actual one after the edit and not the complete error message?
If you read (and post) the complete error message, you would realize that the error is regardless of your class
ChatMessage.Cereal can't serialize the member
ChatMessage::std::string sender;. Because you missedCompiled: https://godbolt.org/z/Gfnz58haE