C++ 在套接字上传递具有父类的类时,只传递父类
我使用boost序列化,我序列化了C++ 在套接字上传递具有父类的类时,只传递父类,c++,inheritance,serialization,C++,Inheritance,Serialization,我使用boost序列化,我序列化了JoinPlayerPacket类并通过套接字传递该类,然后我接受并反序列化并尝试获取JoinPlayerPacket类变量,但它没有定义,只显示一个空字符串,但当我尝试获取父Packet类变量时,一切顺利 //Client (send) JoinPlayerPacket packet{"maxrskiy"}; packet.send_packet(sock_client.sock); //Server(accept) char
JoinPlayerPacket
类并通过套接字传递该类,然后我接受并反序列化并尝试获取JoinPlayerPacket
类变量,但它没有定义,只显示一个空字符串,但当我尝试获取父Packet
类变量时,一切顺利
//Client (send)
JoinPlayerPacket packet{"maxrskiy"};
packet.send_packet(sock_client.sock);
//Server(accept)
char buf[4096];
int bytesReceived = recv(clientSocket, (char*)buf, 4096, 0);
std::stringstream ss = std::stringstream(buf);
boost::archive::text_iarchive ia{ ss };
JoinPlayerPacket packet;
ia >> packet;
std::cout << packet.type << std::endl; // outputs the variable correctly
std::cout << packet.playerId << std::endl; // outputs an empty string
//客户端(发送)
JoinPlayerPackage数据包{“maxrskiy”};
packet.send_packet(sock_client.sock);
//服务器(接受)
char-buf[4096];
int bytesReceived=recv(clientSocket,(char*)buf,4096,0);
std::stringstream ss=std::stringstream(buf);
boost::archive::text_iarchive ia{ss};
JoinPlayerPacket包;
ia>>数据包;
如果不提供数据,很难看到发生了什么。特别是模板实现丢失了,你认为它们是吗?
enum PacketType {
JoinPlayer,
LeavePlayer
};
class Packet {
public:
PacketType type;
Packet(PacketType type) {
this->type = type;
}
Packet() {}
template <typename Archive>
void serialize(Archive& ar, const unsigned int version) { ar& type; }
};
class JoinPlayerPacket : public Packet {
public:
std::string playerId;
JoinPlayerPacket(std::string playerId) : Packet(PacketType::JoinPlayer) {
this->playerId = playerId;
}
JoinPlayerPacket() : Packet(PacketType::JoinPlayer) {}
void send_packet(SOCKET sock) {
std::stringstream ss;
text_oarchive oa{ ss };
oa << this;
send(sock, ss.str().c_str(), ss.str().length(), 0);
}
template <typename Archive>
void serialize(Archive& ar, const unsigned int version) { ar& playerId; ar& type; }
};
class LeavePlayerPacket : public Packet {
public:
std::string playerId;
LeavePlayerPacket(std::string playerId) : Packet(PacketType::LeavePlayer) {
this->playerId = playerId;
}
LeavePlayerPacket() : Packet(PacketType::JoinPlayer) {}
void send_packet(SOCKET sock) {
std::stringstream ss;
text_oarchive oa{ ss };
oa << this;
send(sock, ss.str().c_str(), ss.str().length(), 0);
}
template <typename Archive>
void serialize(Archive& ar, const unsigned int version) { ar& playerId; ar& type; }
};