在Java和C中管道和序列化之间传输数据的区别?

时间:2014-09-29 13:51:21

标签: java c serialization pipe

我正在研究课程操作系统概念中的进程间通信方法。

我真的不了解传输数据的机制。在管道方法的情况下,将在2个进程之间创建一个管道来传输字节流,对吗?

序列化怎么样? 我知道Serialization是将对象转换为字节流以进行传输的方法,我们可以在到达目标时重建对象。

那么在哪种情况下我们使用Serialzation或Pipe来传输数据? 它们之间的优点和缺点是什么?

有人可以向我解释一下转移这些方法数据的非常深入的机制吗?这些机制在Java和C之间是否有所不同? ,还是一样的?

先谢谢。

2 个答案:

答案 0 :(得分:3)

UNIX / Linux中有两种基本类型的管道:命名管道和匿名管道。

匿名管道由" pipe()"创建。系统调用,返回与新创建的管道关联的2个文件描述符,一个用于写入数据,另一个用于从中读取。当您使用" |"连接两个进程时,shell使用匿名管道将一个进程的标准输出连接到另一个进程的标准输入。运营商。

命名管道在文件系统中显示为文件,可以使用普通" open()"打开。系统调用。

在阻塞模式(默认值)下,从管道读取的进程将阻塞,直到数据出现在那里;然后,编写器可以将显示为字节流的数据发送给读者。

这里重要的事实是传输的数据是字节流。数据的发送方和接收方必须就协议达成一致,以确定如何解释字节。一种典型的方法是序列化。考虑32位整数... 4个字节。一些系统在第一个字节中存储具有最高有效位的那些字节(称为big-endian),一些系统在第一个字节(little-endian系统,如x86)中存储最低有效位。通过网络传输此类数据时,此类数据的序列化非常重要,因为每个端口完全可能以不同的顺序存储数据。

但即使在同一主机上的两个进程之间传输数据,序列化也会有所帮助。它可以用于封装对象,以便接收器知道它何时收到了所有内容。例如,对于我们的32位整数,如果接收器不知道它期望一个整数,并且得到3个字节(第4个已被某个调度延迟),它必须知道它需要在继续之前等待。

除了某些语言内置支持序列化之外,这些都不是特定于语言的。 Java就是这样一种语言(参见ObjectInputStream和ObjectOutputStream)。如果您尝试在Java和C程序之间移动数据,并且在Java端要使用这些类,那么您需要了解它们使用的序列化协议。

另一种常见的序列化技术是JSON(JavaScript Object Notation),在C和Java中存在几个好的库。

答案 1 :(得分:1)

  

我真的不了解传输数据的机制。在管道方法的情况下,将在2个进程之间创建一个管道来传输字节流,对吗?

命名或匿名管道是一个流,而不是环回的套接字连接。实际上在某些操作系统中,它由相同的驱动程序/库实现。

  

序列化怎么样?

如何完成序列化不是特定于语言的,您可以以可在C和Java之间共享的方式序列化数据。

  

它们之间的优点和缺点是什么?

有许多形式的序列化,这在一个答案中涵盖的范围太宽泛。你可以就它做一整篇论文。

  

可以向我解释一下,在转移这些方法的数据方面有一个非常深刻的机制吗?

它没有多大意义。一个数据块被复制到OS管理的内存中,这个缓冲的数据可以被另一个程序(或同一个程序)读取

  

Java和C之间的这些机制有何不同? ,还是一样的?

他们都使用相同的OS调用来完成实际工作。 Java API隐藏了这一事实并使其更加Java友好,但它们是相同的。