我有一个系统,其中使用 C# 程序创建序列化文件,然后在另一个 C# 程序中反序列化。我想知道是否可以在 Java 中对 C# 文件进行二进制反序列化?
谢谢
我有一个系统,其中使用 C# 程序创建序列化文件,然后在另一个 C# 程序中反序列化。我想知道是否可以在 Java 中对 C# 文件进行二进制反序列化?
谢谢
您可以尝试使用一些具有两个平台实现并以平台独立格式输出数据的序列化器,例如 Protobuf。
或者,如果您需要在 Java 和 C# 应用程序之间通过网络实现完整的 RPC,您可以选择 Apache Thrift。
我假设您说的是用BinaryFormatter
. 那么答案是合格的“是”,因为 Java 实现了图灵机。然而,这并不简单。
在这种情况下,数据将采用最适合 .NET 运行时使用的格式,并将包含有关 .NET 类型和程序集的信息。您必须为这种格式实现自己的阅读器,然后有一些方法可以在 .NET 和 Java 类型之间进行映射。(Mono 项目实现了BinaryFormatter
与 .NET 的兼容,因此您可以使用他们的阅读器实现作为参考。)
作为替代方案,请考虑使用另一种格式进行数据序列化,例如 JSON。这将使您能够即时移植到多种语言,以及轻松人工检查数据的可能性。
在 Java 中反序列化使用 C# 的内置二进制序列化序列化的对象,您将在 java 中实现 C# 的反序列化逻辑。这是一个相当复杂的过程,所以让我们比较一些选项:
使用适用于 C# 和 Java 的第三方库进行序列化。
编写一个例程来序列化每个对象。一个在 C# 中,一个在 Java 中。这将是乏味的,并且难以维护。
在 Java 中实现 C# 的序列化逻辑,反之亦然。这将是困难的、耗时的,而且您可能不会第一次就做好。
我推荐选项 1,使用第三方库。这是我使用并强烈推荐的两个第三方库。
您可以使用任何跨平台的二进制格式。您的选择包括:
JSON 和 XML (herrrrp) 也是选项,尽管是基于文本的选项。
另一种选择是对数据进行 base64 编码,然后在另一侧对其进行解码;尽管你可能会得到一个巨大的有效载荷,因为它是二进制的(可能不是一个好主意)。