2009-05-04 147 views
5

我有两个需要彼此交谈的应用程序。 App1需要能够序列化App2然后可以反序列化的对象。轻松完成,对吗?这是问题所在; App1是基于C#的,App2是基于Java的。所以App1需要以Java二进制文件格式写出文件。如何才能做到这一点?使用C#序列化Java可反序列化的对象

我看到它的方式有两种选择。第一种方法是找出某种方式在C#中序列化Java对象,以便App1创建适当的文件。我的另一种选择是用Java编写一个转换器,它读入文件并相应地填充对象并序列化新填充的对象。这样C#应用程序只需要写出一些格式化的文本文件,然后转换器就可以解释。

我无法对Java应用程序进行任何更改。

应该怎么做?

更新:

Java的应用程序已在客户因此更改序列化方案会导致现有数据的客户是不兼容的手中。处理此对象时,Java应用程序使用本机Java序列化。对Java应用程序的修改不会发生。

C#应用程序使用协议缓冲区来序列化自己的数据。

+1

是否必须使用二进制格式? Java支持XML序列化。 – Steve 2009-05-04 21:34:34

+1

我认为,是的,它必须是二进制格式,因为他不允许改变它。 – mmr 2009-05-04 22:04:54

回答

7

最佳答案是选项3: 使用与语言无关的序列化方案。

我使用JavaScript。 Thrift是另一种选择,我认为协议缓冲区更侧重于RPC,但也应该可用于序列化。 XML或自定义二进制格式将是其他选项。

编辑: 对不起,没有注意到你不能更改Java应用程序。也就是说,最好的方法是创建自己明确定义的格式,编写一个可以读取该格式的java应用程序,然后为旧应用程序输出一个序列化的java对象。

1

IKVM”可能是你可以使用的东西。该产品允许您将编译的Java字节码(.jar等)转换为.NET DLL。这是非常容易使用,并可能会给你你需要的互操作性。

除此之外,在没有二进制级别互操作的情况下完成此操作的最简单方法是仅使用纯文本格式,例如CSV或XML。

1

只需使用XML序列化。这两个框架都有很好的支持,并且简单易于调试/维护。用Java编写一个小程序,只导入XML并写入二进制文件。

1

最好的办法是编写一些使用Java Native接口的东西。不好玩,但它会起作用。

为此,您可以直接使用JNI(不好玩,但可行的),或者可能有一些工具,在那里,将产生的代码为你 - 看一看痛饮:http://www.swig.org/

你会从C#调用Java为你做持之以恒。