【问题标题】:Serializing data in C在 C 中序列化数据
【发布时间】:2010-07-06 01:56:32
【问题描述】:

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

实际上我想将此二进制文件转换为字节数组,以便可以通过套接字发送。

提前致谢。

【问题讨论】:

    标签: java c networking serialization


    【解决方案1】:

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

    【讨论】:

    • 在 C 中打开套接字,读取文件并将其发送到另一端的 java 服务器套接字不是更简单吗? (诚​​实的问题)
    • @OscarRyz:“序列化数据”通常意味着数据具有某种结构,双方必须本机理解。即使您只是传输一个非结构化文件,也可能存在围绕它的结构化数据 - 例如。文件长度,文件名 - 您也希望接收方理解。
    • @OscarRyz:当我在 Java 中使用 ObjectInputStream 来捕获套接字上的数据时,它会抛出 StreanCorruptedException,可能是由于从 C 端传输了反序列化数据。
    • @guptamukul:那是因为你试图接收一个 Java 对象,但你没有从 C 端发送一个 Java 对象。
    • @OscarRyz:感谢您解决了我的疑问,实际上我是从 C 发送数据并试图通过 ObjectInputStream 接收它,它给出了 StreamCorruptedException。
    【解决方案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 建议的 Google Protocol Buffers 很可能更适合(特别是如果它们是大文件)。

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

    【讨论】:

    • 非常感谢语法,我一定会试试这个东西。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-27
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多