Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java和C中管道和序列化之间的数据传输不同?_Java_C_Serialization_Pipe - Fatal编程技术网

Java和C中管道和序列化之间的数据传输不同?

Java和C中管道和序列化之间的数据传输不同?,java,c,serialization,pipe,Java,C,Serialization,Pipe,我正在学习操作系统概念课程中的进程间通信方法 我真的不了解传输数据的机制。在管道方法的情况下,将在两个进程之间创建一个管道来传输字节流,对吗 那序列化呢? 我知道序列化是一种将对象转换为字节流以进行传输的方法,我们可以在对象到达目标时重建它 那么,在这种情况下,我们使用序列化或管道来传输数据? 它们之间的优缺点是什么 有谁能向我解释一下这些方法在传输数据时的一种非常深层的机制吗?Java和C的这些机制不同吗,还是一样 提前谢谢 我真的不了解传输数据的机制。在管道方法的情况下,将在两个进程之间创建

我正在学习操作系统概念课程中的进程间通信方法

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

那序列化呢? 我知道序列化是一种将对象转换为字节流以进行传输的方法,我们可以在对象到达目标时重建它

那么,在这种情况下,我们使用序列化或管道来传输数据? 它们之间的优缺点是什么

有谁能向我解释一下这些方法在传输数据时的一种非常深层的机制吗?Java和C的这些机制不同吗,还是一样

提前谢谢

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

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

那序列化呢

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

它们之间的优缺点是什么

序列化有多种形式,这是一个太宽泛的主题,无法在一个答案中涵盖。你可以写一整篇论文

你能给我解释一下这些方法传输数据的深层机制吗

没什么大不了的。一个数据块被复制到操作系统管理的内存中,这个缓冲数据可以被另一个程序或同一个程序读取

Java和C的这些机制不同吗,还是一样


它们都使用相同的操作系统调用来完成真正的工作。Java API对您隐藏了这一事实,并使其更加Java友好,但它们是相同的。

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

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

命名管道在文件系统中显示为文件,可以通过正常的打开系统调用打开

默认情况下,在阻塞模式下,从管道读取的进程将阻塞,直到数据出现在管道中;然后,写入程序可以将显示为字节流的数据发送给读取器

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

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

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


另一种常见的序列化技术是JSON JavaScript对象表示法,在C和Java中有几个很好的库。

Hi Peter,非常感谢您的评论。你能给我举一个最有代表性的例子说明这两种方法的优缺点吗?@xtiger没有两种方法,甚至没有2000种。我想说大概有30种常用的方法。它们在速度、兼容性、消息大小、易于解码/编码、易于理解等方面具有相对优势。这些表单中的每一个都可以通过多种方式进行压缩和/或加密,尽管通常不是通过管道进行的。序列化是对数据进行编码和解码的一种方式。管道和插座是移动的方式
它是关于。它们没有可比性,也没有竞争性。谢谢EJP,我对这些术语感到非常困惑