当前位置:  开发笔记 > 编程语言 > 正文

C++设计 - 网络数据包和序列化

如何解决《C++设计-网络数据包和序列化》经验,为你挑选了1个好方法。

对于我的游戏,我有一个Packet类,它代表网络数据包,基本上由一组数据和一些纯虚函数组成

然后我想要从Packet派生类,例如:StatePacket,PauseRequestPacket等.这些子类中的每一个都将实现虚拟函数Handle(),当其中一个数据包时,它将被网络引擎调用.接收到它可以完成它的工作,几个get/set函数可以读取和设置数据数组中的字段.

所以我有两个问题:

    (抽象)Packet类需要是可复制和可分配的,但是没有切片,保留派生类的所有字段.甚至可能派生类没有额外的字段,只有函数,它可以与基类上的数组一起使用.我怎样才能做到这一点?

    在序列化时,我会给每个子类一个唯一的数字ID,然后在子类自己的序列化之前将它写入流.但是对于反序列化,我如何将读取的ID映射到适当的子类以实现它?

如果有人想要任何澄清,请问.

- 谢谢


编辑:我对此不太满意,但这就是我所管理的:

Packet.h:http
: //pastebin.com/f512e52f1 Packet.cpp:http ://pastebin.com/f5d535d19 PacketFactory.h:http
://pastebin.com/f29b7d637 PacketFactory.cpp:http://pastebin.com / f689edd9b PacketAcknowledge.h:http://pastebin.com/f50f13d6f PacketAcknowledge.cpp:http://pastebin.com/f62d34eef


如果有人有时间查看并提出任何改进建议,我会感激不尽.


是的,我知道工厂模式,但我如何编码它来构建每个类?一个巨大的转换声明?这也会重复每个类的ID(一次在工厂,一个在序列化器中),我想避免.



1> Johannes Sch..:

对于复制,您需要编写克隆函数,因为构造函数不能是虚拟的:

virtual Packet * clone() const = 0;

每个Packet实现如下所示:

virtual Packet * clone() const {
    return new StatePacket(*this);
}

例如StatePacket.数据包类应该是不可变的.收到数据包后,其数据可以被复制或丢弃.因此不需要赋值运算符.使赋值运算符为私有,不要定义它,这将有效地禁止分配包.

对于反序列化,您使用工厂模式:创建一个类,该类在给定消息ID的情况下创建正确的消息类型.为此,您可以在已知消息ID上使用switch语句,也可以使用以下映射:

struct MessageFactory {
    std::map map;

    MessageFactory() {
        map[StatePacket::Id] = &StatePacket::createInstance;
        // ... all other
    }

    Packet * createInstance(Packet::IdType id) {
        return map[id](); 
    }
} globalMessageFactory;

实际上,你应该添加一个检查,比如id是否真的已知和这样的东西.这只是一个粗略的想法.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有