0

首先让我解释一下我们的项目。

我们有一个客户端服务器系统。客户端和服务器都是用java实现的。我们正在用 C 重新实现客户端,保持接口相同,并保持服务器仍然在 java 中。

客户端和服务器通信的方式是通过 java 动态代理,remoteid 是网络连接。现在,客户端调用在服务器上调用的方法。显然有序列化和反序列化。我想在 C 中实现服务器期望的相同格式。作为一名 C 黑客,我通过 wireshark 打开数据包并开始在 java 代码中映射实际字节,这对我没有多大帮助。我无法在代码中映射几个字节(显然我没有查看正确的代码)。

我还没有完全理解java动态代理是自动序列化它的库还是你需要在类中实现一些函数,以便可以将东西写入网络。

任何人都可以建议我更人性化的方法来解决这个问题吗?

PS:我对java编程不是很好。

4

5 回答 5

1

我是Google Protocol Buffers的粉丝,用于维护跨语言兼容的序列化接口。您以一种相当简单的格式编写消息格式,并protoc以您想要的任何语言为消息对象生成代码并将它们兼容地序列化。(它也非常擅长确保您以后可以添加更多字段而不会破坏所有内容,这对于轻松维护事物非常重要。)

它默认只处理 Java、C++ 和 Python,但存在 C 插件

于 2012-09-06T22:33:38.293 回答
1

我想在 C 中实现服务器期望的相同格式。

忘掉它。这基本上是不可能的,除非你手头有一个 JVM 来为你做这件事。任何 Java 类都可以定义自己的序列化格式,JDK 本身中的许多都这样做。

考虑另一种协议,或者忘记在 C 中重新实现客户端。无论如何,这样做的目的是什么?一般是逆行。

于 2012-09-06T23:50:26.117 回答
0

我宁愿建议使用Thrift 之类的东西。随着在 C 中重新实现 Java 序列化,您就如履薄冰,如果它可以在您的测试环境中工作 - 它可能会在现实世界中的真实数据上失败。

于 2012-09-06T22:22:01.633 回答
0

正如其中一条评论所建议的那样-我建议您切换协议。
java.lang.reflect.Proxy 本身只是一个调用的拦截器。
我猜InvocationHandler是执行实际通信的那个。
例如,在使用REST框架时,许多实现让客户端决定它希望以哪种格式获得响应 - JSON、XML 或其他格式。
在服务器端,有一些类负责根据请求的格式“呈现”结果。
我建议您实现一种区分 C 客户端和 java 客户端的机制,
并根据客户端类型使用正确的“请求解析器”和“响应编写器”
这样,你也将实现对现有 Java 客户端的向后兼容


另一个选择当然是使用相同的协议,并决定更改现有的 Java 客户端,
在这个选项中,你可以使用 DataInputStream 和 DataOutputStream 从 Stream 中读取和写入数据不仅仅是一个字节数组或单个字节。
我认为,通过一些使用wireshark 的实验,您将了解正确的字节对齐方式,例如写入长值的情况。
我过去使用
DataInputStream 和 DataOutputStream 成功实现了协议读取器和写入器,其中客户端不仅仅是 Java(例如 - 我们有一个 iOS/objective-C 客户端)。

于 2012-09-06T22:34:26.197 回答
0

任何实现 Serializable 接口的 Java 类都使用此处指定的序列化协议(使用 BNF 语法):https ://docs.oracle.com/javase/8/docs/platform/serialization/spec/protocol.html

如果您习惯编写解析器,您绝对可以在 C 中实现此语法,并使用它来反序列化和重新序列化 Java 对象。

于 2016-08-07T00:15:19.347 回答