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

时间:2010-04-18 03:12:43

标签: c flash serialization rmi corba

何时在两个不同的机器/网络/互联网上的程序之间进行通信时需要序列化,编组等?

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

  

我无法使用实现通信   我自己的自定义协议?我猜   如此。

你可以。你可能不应该重新发明轮子。序列化很棘手。使用经过良好测试的标准解决方案可获得更好的结学习API所花费的时间远远少于编写数据传递例程。

  

何时需要序列化等?

对于初学者来说,需要将一些内存结构从一个进程转移到另一个进程。

此处描述的用例更多:http://en.wikipedia.org/wiki/Serialization

  

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

这些“都不是必须的”,就像你说的那样,你可以编写自己的协议。你(IMO)更倾向于依靠这方面的一些现有技术,比如XML或你提到的其他技术。你使用哪种技术实际上取决于你想要做什么,所以我不打算推​​测:)

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

答案 2 :(得分:0)

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