2010-04-18 67 views
2

在两台不同的机器/网络/互联网上的程序之间的通信过程中,序列化,编组等需要什么时候?用不同语言编写的2个程序之间的通信 - 序列化?

假设我有在Java /闪存客户端程序,并用自己的自定义协议下的服务器程序不能执行我沟通?我猜是这样。什么时候需要序列化?我知道Java RMI,CORBA等有这些机制。但为什么?这是必须的吗?请赐教?

回答

1

我不能使用我自己的自定义协议来实现通信使用 吗?我想 所以。

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

当系列化等需要?

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

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

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

没有一个“是必须的”,就像你说的那样,你可以编写自己的协议。 (海事组织)倚重这方面的一些现有技术,比如XML或其他您提到的其他技术。你使用哪种技术真的取决于你想要做什么,所以我不打算推​​测:)

传递序列化数据的一个很好的机制是Google's protocol buffers.他们负责编码(在更多比XML更高效的方式)和端到端翻译。

+0

你的回答有点不错,但没有提供足够的推理或清晰度。如果可能,请以简单而明确和具体的方式解释。谢谢! – user319280 2010-04-18 03:32:12

+0

@ trojanwarrior3000:我的答案的哪些部分不清楚? FWIW,我提供了具体的推理 - 推出自己的协议比较慢,需要序列化来在进程之间传递数据。 – Stephen 2010-04-18 03:36:48

+0

我是这么认为的 - 我认为序列化在使用任意数据类型(如对象)进行远程调用时非常有用 - 那么这些工具就比创建自己的协议更容易。谢谢! – user319280 2010-04-18 04:31:35

0

本,这些天,最好的办法是将XML消息发送来回。

2

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

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

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

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

+0

如果使用字节流协议并处理双方的字节顺序,那足够了吗? – user319280 2010-04-18 07:54:43

+0

希望对这个问题有好处的人会对我的评论投下更多的信息! – user319280 2010-04-18 10:05:20

+0

如果不知道数据的结构,则无法处理字节序。每个领域都必须单独倒置。 – 2010-04-18 10:33:04

相关问题