这是通过网络发送序列化对象的好概念吗?

时间:2010-10-12 09:02:41

标签: c++ serialization boost networking

  • 我有一个客户端和一个服务器
  • 我想将对象从客户端发送到服务器
  • 必须在包含许多对象的“大数据包”中将对象捆绑在一起
  • 对象可以按随机顺序
  • 对象数量未修复
  • 数据包中可能存在服务器未知的对象(因此他需要转储它们)

我对序列化没有多少经验。 我更喜欢Boosts Serialization-framework(如果有可能的话) 我想到了以下概念 (不完整的Pseudocode,受C ++启发,没有特定的Boost :: Serialization-code):

class SerializableObject
{
    virtual int getIdentifier() =0;
    virtual Archive serialize() =0;
}
class SubclassA : public SerializableObject
{
    int getIdentifier() { return 1; }
    Archive serialize() { ... }
    ...
}
class SubclassB : public SerializableObject
{
    int getIdentifier() { return 2; }
    Archive serialize() { ... }
    ...
}

现在在Clientside:

void packAndSendData()
{
    archive << objectA.getIdentifier();
    archive << objectA;
    archive << objectB.getIdentifier();
    archive << objectB;
    myNetworkObject.sendData(archive);
}

在Serverside上:

void receiveAndUnpackData()
{
    archive = myNetworkObject.receiveData();

    while(archive.containsObjects()) //possible?
    {
        int type = archive.deserializeNextObject();
        if(type == 1)
            SubclassA objectA = archive.deserializeNextObject();
        if(type == 2)
            SubclassB objectB = archive.deserializeNextObject();
        else
            archive.dropNextObject(); //How to do this? Possible?
    }
}

所以问题是:
- 这是一个好主意还是有其他可能性?
- 使用Boost :: Serialization
这样的概念是否可行 - 如果没有:是否有其他库可以帮助实现这个概念?

我试图尽可能地压缩问题并提供尽可能多的信息。希望我的意思和我想要达到的目标是可以理解的。 如果有人对这个问题有更好的标题,请修复现有问题,我不知道如何用所有方面描述这个问题。

2 个答案:

答案 0 :(得分:1)

您描述的方法是一个开始,但您是否考虑过如何序列化对象之间的引用。即序列化对象图。此外,如果您的客户端和服务器可能彼此不同步,则可能需要考虑数据格式版本控制。它不一定是一个简单的问题。

  

是否还有其他可以帮助的库   实施这个概念?

您可以查看Google的Protocol Buffers项目。它可能做你想要的,并且语言中立。

答案 1 :(得分:0)

Boost序列化绝对是一个开始,但还有其他考虑因素,如

  1. 碎片 - 即如果您的对象的“集合”不适合一个数据包会发生什么,另一方面您如何知道您已收到代表“集合”的所有数据
  2. 平台 - 如果你有一个同质的环境(比如所有linux),这不是问题,但如果你有混合,这可能是一个问题(我不相信boost序列化可以跨不同的字节编码工作 - 我这里可能是错的,需要检查文档)这也适用于语言(上面提到的安迪约翰逊提出的一点) - 使用boost序列化,你与C ++联系在一起。
  3. 我建议你查看一个操作系统消息产品,特别是如果你想发送结构,比如Open DDS。所有的序列化等都可以很好地为您处理,并且您可以获得更多的特性和功能。当然,它的重量相当大,而且性能略低于asio +序列化,但你必须做的工作少了。