使用C#序列化Java反序列化对象

使用C#序列化Java反序列化对象,c#,java,serialization,C#,Java,Serialization,我有两个应用程序需要相互对话。App1需要能够序列化App2可以反序列化的对象。容易做,对吗?问题就在这里;App1是基于C的,App2是基于Java的。因此App1需要以Java二进制文件格式写出文件。如何做到这一点 在我看来,我有两个选择。第一个是找出某种方法来序列化C#中的Java对象,以便App1只创建适当的文件。我的另一个选择是用Java编写一个转换器,它读取文件并相应地填充对象,然后序列化新填充的对象。这样,C#应用程序只需写出某种格式化的文本文件,然后由转换器进行解释 我无法对Ja

我有两个应用程序需要相互对话。App1需要能够序列化App2可以反序列化的对象。容易做,对吗?问题就在这里;App1是基于C的,App2是基于Java的。因此App1需要以Java二进制文件格式写出文件。如何做到这一点

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

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

如何做到这一点

更新:

Java应用程序已经掌握在客户手中,因此更改序列化方案将导致客户现有数据不兼容。Java应用程序在处理此对象时使用本机Java序列化。无法对Java应用程序进行修改


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

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

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

编辑: 抱歉,我没有注意到您不能对Java应用程序进行更改。也就是说,最好的方法可能是创建自己定义良好的格式,编写一个可以读取该格式的java应用程序,然后为遗留应用程序输出一个序列化的java对象。

“”可能是您可以使用的。此产品允许您将编译后的java字节码(.jar等)转换为.NET DLL。它非常易于使用,并可能为您提供所需的互操作


除此之外,在没有二进制级互操作的情况下实现这一点的最简单方法是只使用纯文本格式,如CSV或XML。

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

您最好编写一些使用Java本机接口的程序。不好玩,但会有用的

您可以直接使用JNI(不有趣但可行)来实现这一点,或者可能有一些工具可以为您生成代码——看看SWIG:


您可以从C#调用Java来为您执行持久化。

它必须使用二进制格式吗?Java支持XML序列化。我认为,是的,它必须是二进制格式,因为他不允许更改它。也许是这样,但结果必须仍然是Java格式。问题是:“我不能对Java应用程序进行任何更改。”我同意编辑解决方案。如果您可以控制C#应用程序,那么您可以编写一个小java程序,从C#中读取xml序列化对象,并输出java本机序列化文件。当您准备好“导出”或任何您的流程时,您的C#应用程序可能会生成java应用程序。