2个用不同语言编写的程序之间的通信 - 序列化?

Posted

技术标签:

【中文标题】2个用不同语言编写的程序之间的通信 - 序列化?【英文标题】:communication between 2 programs written in different language - Serialization? 【发布时间】:2010-04-18 03:12:43 【问题描述】:

在跨 2 台不同机器/网络/Internet 的程序之间进行通信期间,何时需要序列化、编组等?

假设我有一个 java/flash 中的客户端程序和一个 C 中的服务器程序。我不能使用我自己的自定义协议来实现通信吗?大概吧。什么时候需要序列化等?我知道 Java RMI、CORBA 等有这些机制。但为什么?这是必须的吗?请赐教?

【问题讨论】:

【参考方案1】:

程序中的对象具有由编译器强加的明确定义的内存布局。但是这种布局在另一个程序中不会完全相同,运行在另一台机器上,由不同的编译器编译。而且它通常与传输介质不太兼容,例如网络连接或文件。将对象从一台机器转移到另一台机器时需要注意这一点。

文件和网络数据包是简单的字节流。这就是序列化发挥作用的地方,您需要将内存中的对象序列化为字节流。并且需要在接收端反序列化,从字节流返回到对象中。

这样做的明显方法是二进制序列化。您获取对象中每个字段的字节并将它们写入流。效率很高,但也很麻烦。您遇到的第一个问题是接收端对对象的外观有不同的想法。它可能使用不同版本的对象声明进行编译,例如添加了一个字段。当对象在不同机器之间交换时,问题就更加严重了。他们可能对整数中的字节数有非常不同的想法。或字节顺序(字节序)。

对于这个问题已经有许多个解决方案。它们通常涉及某种描述对象中字段的元数据。 Unicode 的出现使得将元数据和字段值都放入文本描述中成为可能,XML 就是最好的例子。

【讨论】:

如果使用字节流协议并处理两边的字节序,这就足够了吗? 希望能解决这个问题的人多多指教我的评论! 在不了解数据结构的情况下,您无法处理字节顺序。每个字段都必须单独反转。 服务器看到的数据包(命令)的类型,数据结构,总长度,每个字段有多少字节等将在协议规范中指定。那是什么问题? 或者还有什么困难?【参考方案2】:

我不能使用 我自己的自定义协议?我猜 所以。

你可以。你可能不应该重新发明***。序列化很棘手。使用经过良好测试的标准溶液以获得更好的结果。与编写数据传递例程相比,学习 API 所花费的时间要少得多。

什么时候需要序列化等?

首先,需要将一些内存结构从一个进程转移到另一个进程。

这里描述了更多用例:http://en.wikipedia.org/wiki/Serialization

我知道 Java RMI、CORBA 等有这些机制。但为什么?这是必须的吗?请赐教?

正如您所说,这些都不是“必须的”,您可以编写自己的协议。您比(IMO)更好地依赖该领域的一些现有技术,例如 XML 或您提到的其他技术之一。您使用哪种技术实际上取决于您要做什么,所以我不会推测:)

传递序列化数据的一个很好的机制是 Google's protocol buffers. 他们负责编码(以比 XML 更有效的方式)和字节序转换。

【讨论】:

您的回答在某种程度上还可以,但没有提供足够的推理或清晰度。如有可能,请以简单明了、具体的方式解释。谢谢! @***warrior3000:我的回答中哪一部分不清楚? FWIW,我确实提供了具体的推理 - 推出自己的协议比较慢,需要序列化才能在进程之间传递数据。 我是这样理解的——我想序列化在使用任意数据类型(如对象)进行远程调用时很有用——然后这些工具比制作自己的协议更容易。谢谢! @***warrior3000:添加了使用协议缓冲区的指针。如果您提供有关您要解决的问题的详细信息,您可能会得到更好的答案。【参考方案3】:

目前最好的方法是来回发送 XML 消息。

【讨论】:

以上是关于2个用不同语言编写的程序之间的通信 - 序列化?的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序开发需要学啥知识

在不同语言的进程之间有效地共享数据

如何跨语言在多个应用程序之间建立通信

序列化之 TLV

由遍历序列构造二叉树(C语言)

Android之AIDL知识总结