我对序列化没有多少经验。 我更喜欢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
这样的概念是否可行
- 如果没有:是否有其他库可以帮助实现这个概念?
我试图尽可能地压缩问题并提供尽可能多的信息。希望我的意思和我想要达到的目标是可以理解的。 如果有人对这个问题有更好的标题,请修复现有问题,我不知道如何用所有方面描述这个问题。
答案 0 :(得分:1)
您描述的方法是一个开始,但您是否考虑过如何序列化对象之间的引用。即序列化对象图。此外,如果您的客户端和服务器可能彼此不同步,则可能需要考虑数据格式版本控制。它不一定是一个简单的问题。
是否还有其他可以帮助的库 实施这个概念?
您可以查看Google的Protocol Buffers项目。它可能做你想要的,并且语言中立。
答案 1 :(得分:0)
Boost序列化绝对是一个开始,但还有其他考虑因素,如
我建议你查看一个操作系统消息产品,特别是如果你想发送结构,比如Open DDS。所有的序列化等都可以很好地为您处理,并且您可以获得更多的特性和功能。当然,它的重量相当大,而且性能略低于asio +序列化,但你必须做的工作少了。