2010-07-06 32 views
2

请告诉我如何在C中序列化数据(如二进制文件)。并且,如何通过套接字发送此串行化数据,以便它可以被相应的Java客户端成功接收。序列化C中的数据

其实我想将这个二进制文件转换成字节数组,以便它可以通过套接字发送。

在此先感谢。

回答

3

对于C和Java之间的互操作,您可以使用Google的Protocol Buffers(Google参考实现支持C++和Java,并且第三方实现为普通C)。

+0

只要在C中打开套接字,读取文件并将它发送到另一端的java服务器套接字,会不会更简单? (诚​​实的问题) – OscarRyz 2010-07-06 02:19:44

+0

@OscarRyz:“序列化数据”通常意味着数据具有某种结构,双方必须本地理解。即使你只是传输一个非结构化文件,也可能存在结构化数据 - 例如。文件长度,文件名 - 你也希望被接收方理解。 – caf 2010-07-06 02:31:13

+0

@OscarRyz:当我在Java中使用ObjectInputStream来捕获套接字上的数据时,它抛出了一个StreanCorruptedException,并且可能是由于反序列化数据从C端传输。 – user268758 2010-07-06 02:33:16

2

你有使用通讯格式考虑如JSON而不是原始字节RPC

有关哪些对C &的Java提供JSON库(更多可用的JSON网站)

  1. 堆栈溢出C JSON implementation
  2. JsonGlib(上述链接中引用的GNOME C JSON库)
  3. JSON in Java

使用JSON的优点包括:

  1. 语言独立性
  2. 易于机器解析&产生
  3. 便于人类读写(Protocol Buffers的不提供此)

如果您需要传输对象实例,JSON将是理想的。如果你真的在处理平面二进制文件(不是序列化的对象),那么caf建议的Protocol Buffers by Google很可能更适合(尤其是如果它们是大文件的话)。

注意: JSON要求将您的字节内容编码为BASE64字符串进行传输。

+0

感谢很多语法,我一定会尝试这个东西。 – user268758 2010-07-07 12:22:03

0

C和java.lang.Socket中的send()/ recv()都可以在字节数组上无缝地运行。所以,如果你需要的只是发送普通字节数组,而没有任何结构特定的编码,你并不需要任何序列化。

+0

是的,它解决了我的问题。非常感谢。 – user268758 2010-07-07 12:20:57