我有两个需要相互交谈的应用程序。 App1需要能够序列化App2然后可以反序列化的对象。轻松完成,对吧?这是问题所在; App1基于C#,App2基于Java。因此App1需要以Java二进制文件格式写出文件。怎么办呢?
我看到它的方式,我有两个选择。第一个是弄清楚在C#中序列化Java对象的一些方法,以便App1只创建适当的文件。我的另一个选择是用Java编写一个转换器来读取文件并相应地填充对象并序列化新填充的对象。这样,C#app只需写出转换器然后解释的某种格式化文本文件。
我无法对Java应用程序进行任何更改。
应该怎么做?
更新
Java应用程序已经掌握在客户手中,因此更改序列化方案会导致客户现有数据不兼容。 Java App在处理此对象时使用本机java序列化。不能对Java应用程序进行修改。
C#app使用协议缓冲区来序列化自己的数据。
答案 0 :(得分:7)
最佳答案是选项3: 使用语言中立的序列化方案。
我使用JavaScript。 Thrift是另一种选择,我认为协议缓冲区更侧重于RPC,但也应该可用于序列化。 XML或自定义二进制格式将是其他选项。
编辑: 抱歉,没有注意到您无法对Java应用程序进行更改。也就是说,最好的方法可能是创建自己定义良好的格式,编写一个可以读取该格式的Java应用程序,然后为遗留应用程序输出一个序列化的java对象。
答案 1 :(得分:1)
“IKVM”可能是您可以使用的内容。该产品允许您将已编译的java字节码(.jar等)转换为.NET DLL。它非常易于使用,可能会为您提供所需的互操作。
除此之外,在没有二进制级别互操作的情况下实现此目的的最简单方法是使用纯文本格式,例如CSV或XML。
答案 2 :(得分:1)
只需使用XML序列化。这两个框架都有很好的支持,简单性将使调试/维护更容易。用Java编写一个小程序,只导入XML并写入二进制文件。
答案 3 :(得分:1)
你最好的选择是写一些使用Java Native界面的东西。不好玩,但它会起作用。
您可以使用JNI直接执行此操作(不是很有趣但可行)或者可能有一些工具可以为您生成代码 - 请看一下SWIG:http://www.swig.org/
你可以从C#调用Java来为你做持久性。