何时在两个不同的机器/网络/互联网上的程序之间进行通信时需要序列化,编组等?
假设我在java / flash中有一个客户端程序,在C中有一个服务器程序。我不能使用自己的自定义协议实现通信吗?大概吧。何时需要序列化等?我知道Java RMI,CORBA等都有这些机制。但为什么?这是必须的吗?请赐教?
答案 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消息。