在Java中反序列化C#二进制数据

4

我有一个系统,其中使用C#程序创建了一个序列化文件,并在另一个C#程序中进行反序列化。我想知道是否可能在Java中对C#文件进行二进制反序列化?

谢谢。


2
我认为Java不能使用BinaryFormatter的输出,但是你可以使用Xml、Json、Protobuf。 - I4V
1
@I4V:当然,Java 可以使用 .Net 二进制格式化程序的输出。只是目前没有已知的实现... :) - Boris B.
4个回答

4
你可以尝试使用一些流行的序列化工具,例如Protobuf,该工具支持多种平台,并且可以输出独立于平台的数据格式。
如果你需要在Java和C#应用程序之间实现全面的网络RPC通信,那么你可以选择使用Apache Thrift。

3
我假设您所说的是使用BinaryFormatter序列化的对象。那么答案是“是”,因为Java实现了图灵机。但是,这并不是一件容易的事情。
在这种情况下,数据将以最适合.NET运行时消费的格式呈现,并包含有关.NET类型和程序集的信息。您需要实现自己的读取器来读取此格式,然后找到一种方法在.NET和Java类型之间进行映射。(Mono项目实现了一个与.NET兼容的BinaryFormatter,因此您可以使用他们的读取器实现作为参考。)
作为替代方案,请考虑使用另一种数据序列化格式,例如JSON。这将使您立即具备广泛语言的可移植性,并且还可以轻松人工检查数据。

JSON 在技术上并不是二进制序列化。也许它是 OP 的可行替代方案。只是指出这一点。 - William Morrison
@WilliamMorrison 我从未声称它是二进制序列化。 OP 没有表明需要二进制序列化,他们只是在询问是否可以从 Java 读取一个特定格式的二进制序列化 C# 对象图。 - cdhowie
Protobuf是一种二进制序列化的替代方案,这也是我建议使用它的原因。JSON则不是。如果您想讨论我的答案,请在我的回答中进行。 - William Morrison
@WilliamMorrison,我不再对我们两个答案的合法性进行讨论,因为我认为这两个答案都可以完全满足这个特定问题的要求。虽然OP目前正在使用和询问.NET Framework中内置的特定二进制序列化格式,但并不排除使用非二进制序列化替代方案的可能性。 - cdhowie
我显然不同意,但除此之外我认为你的回答很好。 - William Morrison
显示剩余2条评论

1
在Java中反序列化一个使用C#内置二进制序列化的对象需要实现C#的反序列化逻辑。这是一个相当复杂的过程,因此我们比较一些选项:
  1. 使用一个支持C#和Java的第三方序列化库。
  2. 编写一个用于序列化每个对象的例程。一个在C#中,一个在Java中。这将是繁琐的,难以维护的。
  3. 在Java中实现C#的序列化逻辑,或者反之亦然。这将是困难的、耗时的,并且你可能不会在第一次就做对。
我推荐选项1,使用第三方库。这里有两个我使用过并且高度推荐的第三方库。 Google ProtoBufs Apache Thrift

0

您可以使用任何跨平台二进制格式。其中包括以下选项:

  • Protobuf
  • BSON(二进制JSON)
  • GZIP

JSON和XML(herrrrp)也是选项,尽管它们是基于文本的。

另一个选择是对数据进行base64编码,并在另一端解码;尽管由于它是二进制数据,您可能会得到巨大的负载(这可能不是一个好主意)。


gzip是一种压缩格式。我不明白它如何适合那个列表。你是不是想说别的什么? - leppie
@leppie 如果是同一物理系统,可以在一个程序中对其进行GZip压缩,然后在另一个程序中解压缩。这不就是你想要的吗?即使是在网络上,你也可以将其发送到另一端并在那里解压缩。 - ashes999

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接