客户端服务器c++序列化

client server c++ serialization

本文关键字:序列化 c++ 服务器 客户端      更新时间:2023-10-16

我正在用c++为客户端和服务器编写一些代码。

我使用boost serialize在客户端序列化对象,然后将其发送到服务器。然后,服务器反序列化流并重新创建对象。然后服务器调用对象的run函数。然后,服务器序列化该对象并将其发送回客户端。

我这样做的原因是,例如,客户端需要知道服务器上的/home/dataincoming文件夹中有哪些文件。

这只是一个简单的例子

我的问题是,对于序列化的对象,我需要在服务器和客户端上使用相同的代码。或者服务器如何知道如何反序列化发送的对象。

因此,如果我更改服务器代码,我需要确保我也将代码转移到客户端程序。

  1. 程序员如何轻松解决客户端和服务器上重复代码的问题?

  2. 或者有一些方法我可以序列化,所以这个重复的代码不需要存在于客户端和服务器上?

  3. 或者我只是发送一个协议流到服务器,并让服务器读取该协议流来重建要运行的命令和要发回的信息

似乎最简单的方法是在客户端构造一个对象,让它在服务器上运行,然后将结果发送回客户端。

谢谢你的建议!

对于一般的客户端服务器操作:

  1. 将代码编译成一个库,并在客户端和服务器端同时使用该库。

  2. 您的客户端和服务器都需要理解数据格式。这是没有办法的。

  3. 你可以有一个更抽象的层,允许客户端提交新的数据类型的格式,但是这个抽象层本身需要是客户端和服务器都能理解的数据格式。

我不清楚你的例子与一般情况有什么不同。

客户端和服务器必须共享数据(和数据格式),但不共享代码。

听起来你的对象封装了三件事:

  1. 部分客户端代码
  2. 部分服务器代码

许多面向对象编程鼓励将数据和对其进行操作的代码放在同一个对象中,但这并不总是最好的解决方案。为什么不把这些东西分开呢?

将数据放入数据对象并序列化。服务器将拥有对该数据进行操作的东西(可能是某个对象,但不一定),客户端将拥有对该数据进行操作的东西。所以,我认为你只需要重新考虑你的程序是如何构建的。

您描述的架构还有另一个缺点。如果要修改服务器的行为,还必须更新客户机。如果这些关注点是分开的,这就不是问题了。您必须同时更新客户机和服务器的唯一原因是数据格式发生了变化。

通常编码和解码由您使用的序列化库负责。(谷歌proprobuf, nano-pb, boost等)然而,由于编码和解码到类/结构本质上是相同的。

所以本质上我们需要在两端(服务器和客户端)获得相同的信息一个好主意是为这个功能模块创建一个dll或.so,当更改时可以在服务器和客户端上反映,而无需重新编译。