1

我有一个用 C# 实现的客户端-服务器系统,客户端和服务器通过序列化/反序列化交换 .Net 对象并通过 TCP/IP 进行通信。这在本地网络上运行,它不是基于 Web 或基于 Internet 的。

现在我想包括通过 wifi 连接的 Android 客户端。同样,这只是本地网络,不是通过 Internet 也不是基于 Web 的。Android 编程将使用 Java。(我知道适用于 Android 的 Mono,但现在不想涉足它。)

是否有一些相当简单的方法来实现 Java 和 .Net 对象之间的对象到对象交换,当然,前提是它们是兼容的?

我看过一些 JSON(Java 端的 Jackson 和 .Net 端的 Json.Net),我猜它可能可以完成,但只有在每一端尽快重新映射事物对象变得相当复杂。

还有其他建议吗?基于 JSON 还是其他方式?

PS。我的问题与用于将 Java 的 JSON 与 C# 相互转换的映射工具有些相关,但它从未得到合适的答案,可能是由于问题中的信息不足。此外,我不在乎最终是使用基于 JSON 的传输方式还是 XML 或其他方式。

4

3 回答 3

0

SO用户“默认语言环境”应该为此获得荣誉,但他/她只通过评论回答。因此,为了非常清楚我的选择是什么,我将回答我自己的问题。

我决定使用 Google Protocol Buffers,在我看来,它比 JSON 更好地支持在 Java 和 .Net 之间来回移动对象。因为我对 C# 有很多经验,并且有很多现有的 C# 定义的类,所以我选择了 Marc Gravell 的 .Net 端的 protobuf-net 程序,以及谷歌自己对 Android 端的支持(不 - 见编辑) . 这意味着我在 C# 中定义对象,而不是在 .proto 文件中 - protobuf-net 生成 .proto 文件,然后我从中生成 Java 代码。

顺便说一句,作为传输机制,我在 Android 端使用了一个名为 naga 的鲜为人知的程序。http://code.google.com/p/naga/ Naga 似乎工作正常,并且有据可查并且有示例程序,在我看来应该更广为人知。

编辑:

好的,我现在已经让我满意了。这是我正在使用的:

Google 协议缓冲区作为交换格式:https ://developers.google.com/protocol-buffers/

Marc Gravell 在 C# 端的 protobuf-net:http ://code.google.com/p/protobuf-net/

在 Java 端称为 protostuff 的程序:http ://code.google.com/p/protostuff/

(由于 Google 的实现是基于 Java 对象不可变的,所以我更喜欢 protostuff 而不是协议缓冲区的官方 Google Java 实现。)

实际上,我没有使用纯协议缓冲区作为交换格式——我在数据前面加上正在传输的(最外层)类的名称。这使得数据可以自我识别,以便在另一端进行反序列化。

于 2013-07-29T12:19:19.723 回答
0

我建议使用 JSON 或 XML(基于 .xsd 文件),因为它们独立于它们各自的实现(而不是类似于ObjectOutputStreamjava 中的)。

在两个组件(客户端和服务器)之间使用这种格式的问题是它们需要具有相同的版本。我的最佳做法是对格式进行一个基本定义(我将 xml 与一个 xsd 文件一起使用,该文件指定 xml 的外观),然后用于jaxb生成的 java 类。这样,您就可以在 java 部分(取消)编组从/到 xml。

我非常确定.NET 世界中也存在类似的情况。

JSON 的大小比 xml 小,我发现 xml 更具可读性。

于 2013-07-23T12:22:11.743 回答
0

你也可以试试 wox ( https://github.com/codelion/wox ),它是一个基于 XML 的 Java 和 C# 的跨平台序列化库。

于 2014-08-03T02:23:44.887 回答