Сериализация данных с использованием серийных и пропущенных данных

Можно ли сериализовать данные без сериализации информации о типе? Я спрашиваю, потому что я использую Cereal для сериализации данных в пакеты и отправки их по сети и хочу максимально уменьшить размер пакета, таким образом, не включая информацию о типе, поможет.

Единственная причина, по которой я считаю это возможным, заключается в том, что на отправляющей и получающей стороне приложение уже знает информацию о типе и в каком порядке она была сериализована.

Проще понять, как именно я сериализую и десериализую данные из моей реальной реализации:

NetPacket.h

#pragma once

#include <cereal\archives\portable_binary.hpp>
#include <cereal\types\polymorphic.hpp>
#include <cereal\types\memory.hpp>
#include <cereal\types\vector.hpp>
#include <cereal\types\string.hpp>
#include <sstream>

class NetVar_ {
protected:
virtual void MakeMePolymorphic() {}
public:
template <class Archive> void serialize(Archive & archive) {}
};

class NetPacket;

template <class VARTYPE> class NetVar : public NetVar_
{
public:
NetVar(void) {}

NetVar(VARTYPE Value)
{
Var = Value;
}

template <class Archive> void serialize(Archive & archive)
{
archive(Var);
}

private:
friend class NetPacket;
VARTYPE Var;
};class NetPacket
{
private:
ENetHost* Host;
enet_uint8 ChannelNumber;
unsigned int ThisMessageID;
std::vector<std::shared_ptr<NetVar_>> PacketData;

std::string SerializePacket();

public:
NetPacket(ENetHost* iHost, const unsigned int MessageID, enet_uint8 ChannelNum);

NetPacket(const char* Data, size_t Size);

template <class DATATYPE> void WriteData(DATATYPE AddData)
{
PacketData.push_back(std::make_shared<NetVar<DATATYPE>>(AddData));
}

template <class DATATYPE> DATATYPE ReadData(const unsigned int VarNum) const
{
std::shared_ptr<NetVar_> Content = PacketData[VarNum];
std::shared_ptr<NetVar<DATATYPE>> Temp = std::static_pointer_cast<NetVar<DATATYPE>>(Content);
return Temp->Var;
}

void Send(const bool Reliable);

void Send(NetClient* Client, const bool Reliable);

unsigned int GetMessageID(void) const;

enet_uint8 GetChannelNumber(void) const;

};

NetPacket.cpp

#include <enet\enet.h>
#include "NetClient.h"
#include "NetPacket.h"// Register Types here that you want to
// read and write to packets

CEREAL_REGISTER_TYPE(NetVar<bool>);

CEREAL_REGISTER_TYPE(NetVar<unsigned int>);
CEREAL_REGISTER_TYPE(NetVar<int>);

CEREAL_REGISTER_TYPE(NetVar<float>);

CEREAL_REGISTER_TYPE(NetVar<std::string>);std::string NetPacket::SerializePacket()
{
std::ostringstream SData;
{
cereal::PortableBinaryOutputArchive Archive(SData);
Archive(ThisMessageID, PacketData);
}
return SData.str();
}

NetPacket::NetPacket(ENetHost* iHost, const unsigned int MessageID, enet_uint8 ChannelNum)
{
Host = iHost;
ThisMessageID = MessageID;
ChannelNumber = ChannelNum;
}

NetPacket::NetPacket(const char* Data, size_t Size)
{
std::istringstream SData(std::string(Data, Size));
{
cereal::PortableBinaryInputArchive Archive(SData);
Archive(ThisMessageID, PacketData);
}
}

void NetPacket::Send(const bool Reliable)
{
auto Out = SerializePacket();
ENetPacket* Packet;
if (Reliable)
{
Packet = enet_packet_create(Out.data(), Out.size(), ENET_PACKET_FLAG_RELIABLE);
}
else {
Packet = enet_packet_create(Out.data(), Out.size(), ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT);
}
enet_host_broadcast(Host, ChannelNumber, Packet);
}

void NetPacket::Send(NetClient* Client, const bool Reliable)
{
auto Out = SerializePacket();
ENetPacket* Packet;
if (Reliable)
{
Packet = enet_packet_create(Out.data(), Out.size(), ENET_PACKET_FLAG_RELIABLE);
}
else {
Packet = enet_packet_create(Out.data(), Out.size(), ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT);
}
enet_peer_send(Client->GetPeer(), ChannelNumber, Packet);
}

unsigned int NetPacket::GetMessageID(void) const
{
return ThisMessageID;
}

enet_uint8 NetPacket::GetChannelNumber(void) const
{
return ChannelNumber;
}

Как видно из ReadData и WriteData, определенных в NetPacket.h, для чтения и записи данных вам необходимо указать информацию о типе в функции шаблона. Из-за этого требования, информация о типе известна читателю и концу автора и в каком порядке она была написана. Есть ли способ пропустить информацию о типе при сериализации данных?

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

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]