【问题标题】:Can a java program read an object serialized by C#? [closed]java程序可以读取C#序列化的对象吗? [关闭]
【发布时间】:2017-08-09 13:30:32
【问题描述】:

我正在用 java 开发一个项目,它正在替换旧的 C# 程序。在旧的 C# 程序中,用户可以将他们正在处理的数据保存到 GZip 文件中,通过序列化包含所有数据的包装器对象并使用 GZipStream 编写它。

我想为用户提供加载使用旧系统保存的数据的选项。使用 Java 的 GZipInputStream 打开 GZip 文件很简单,但是我该如何反序列化对象呢?

我做了一点研究,发现了这个问题:Can a serialized simple java object be deserialized by C#? 那里的答案说没有库可以做到这一点,但是有关于Java如何序列化对象的文档,并且可以编写自己的代码来反序列化它们。

是否有从 C# 到 Java 的已知方法?还是我应该从头开始编写自己的转换器?

【问题讨论】:

  • 您是否考虑过(作为一种解决方法)创建一个可以用 C# 编写的转换器,反序列化对象,然后将其序列化为与语言无关的东西,例如 protobuff、json、xml...?
  • 您需要兼容版本的 C# 对象才能在 Java 程序中反序列化。这并不容易获得并且需要专家知识来调试。我建议重新考虑您的方法。
  • @Stonehead 这真是个好主意,我可能最终会这样做。

标签: java c# serialization deserialization


【解决方案1】:

您必须序列化 JSON 或 XML 文件中的所有内容。根本不应该将二进制数据存储在文件中。然后,您可以使用任意库在 Java 中对其进行反序列化。

您可以使用 JSON.net 对其进行序列化,并使用 Jackson 对其进行反序列化。

更新:事实上,您实际上可能会编写一个 SaveData 类,将其编译为 .dll 并使其可用于 Com 互操作。然后,有一些java第三方库可以利用dll中的SaveData类,使其可以在java应用程序中进行互操作。然后,将这个 SaveData 序列化成一个文件(二进制格式就可以了)。但是我不确定序列化将如何在字节级别上进行。当你在java端反序列化它时,你真的会得到相同的对象吗?这个解决方案可能有效,但它很难看,至少和重写 c# 应用程序以写入 json 一样“痛苦”

【讨论】:

  • 用户是否可以将他们的旧数据保存到 JSON 或 XML 文件中,但不幸的是,事实并非如此。
  • 无论如何,你原来的问题的答案是否定的,Java 程序不能做这样的事情。
  • -1 他没有使用文本,他肯定可以使用二进制格式。一个 java 程序当然可以做这样的事情,但除非其他人已经这样做了,否则为了实现 OP 的目标,这样做太复杂了。
  • 更新了我的答案
【解决方案2】:

您可以在 jar 中嵌入一个小的 .NET 应用程序并使用 this SO question 调用 .NET 应用程序

.NET 应用程序会将文件反序列化为 .NET 对象,然后将 .NET 对象转换为 xml 或 json。然后可以将 xml/json 反序列化为 JVM 中的等效 java 对象

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 2013-07-14
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多