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

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

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

【问题讨论】:

    标签: c flash serialization rmi corba


    【解决方案1】:

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

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

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

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

    【讨论】:

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

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

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

    什么时候需要序列化等?

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

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

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

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

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

    【讨论】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      相关资源
      最近更新 更多