【发布时间】:2010-04-18 03:12:43
【问题描述】:
在跨 2 台不同机器/网络/Internet 的程序之间进行通信期间,何时需要序列化、编组等?
假设我有一个 java/flash 中的客户端程序和一个 C 中的服务器程序。我不能使用我自己的自定义协议来实现通信吗?大概吧。什么时候需要序列化等?我知道 Java RMI、CORBA 等有这些机制。但为什么?这是必须的吗?请赐教?
【问题讨论】:
标签: c flash serialization rmi corba
在跨 2 台不同机器/网络/Internet 的程序之间进行通信期间,何时需要序列化、编组等?
假设我有一个 java/flash 中的客户端程序和一个 C 中的服务器程序。我不能使用我自己的自定义协议来实现通信吗?大概吧。什么时候需要序列化等?我知道 Java RMI、CORBA 等有这些机制。但为什么?这是必须的吗?请赐教?
【问题讨论】:
标签: c flash serialization rmi corba
程序中的对象具有由编译器强加的明确定义的内存布局。但是这种布局在另一个程序中不会完全相同,运行在另一台机器上,由不同的编译器编译。而且它通常与传输介质不太兼容,例如网络连接或文件。将对象从一台机器转移到另一台机器时需要注意这一点。
文件和网络数据包是简单的字节流。这就是序列化发挥作用的地方,您需要将内存中的对象序列化为字节流。并且需要在接收端反序列化,从字节流返回到对象中。
这样做的明显方法是二进制序列化。您获取对象中每个字段的字节并将它们写入流。效率很高,但也很麻烦。您遇到的第一个问题是接收端对对象的外观有不同的想法。它可能使用不同版本的对象声明进行编译,例如添加了一个字段。当对象在不同机器之间交换时,问题就更加严重了。他们可能对整数中的字节数有非常不同的想法。或字节顺序(字节序)。
对于这个问题已经有许多个解决方案。它们通常涉及某种描述对象中字段的元数据。 Unicode 的出现使得将元数据和字段值都放入文本描述中成为可能,XML 就是最好的例子。
【讨论】:
我不能使用 我自己的自定义协议?我猜 所以。
你可以。你可能不应该重新发明轮子。序列化很棘手。使用经过良好测试的标准溶液以获得更好的结果。与编写数据传递例程相比,学习 API 所花费的时间要少得多。
什么时候需要序列化等?
首先,需要将一些内存结构从一个进程转移到另一个进程。
这里描述了更多用例:http://en.wikipedia.org/wiki/Serialization
我知道 Java RMI、CORBA 等有这些机制。但为什么?这是必须的吗?请赐教?
正如您所说,这些都不是“必须的”,您可以编写自己的协议。您比(IMO)更好地依赖该领域的一些现有技术,例如 XML 或您提到的其他技术之一。您使用哪种技术实际上取决于您要做什么,所以我不会推测:)
传递序列化数据的一个很好的机制是 Google's protocol buffers. 他们负责编码(以比 XML 更有效的方式)和字节序转换。
【讨论】:
目前最好的方法是来回发送 XML 消息。
【讨论】: