如何将Java对象转换为C ++对象?

我的问题是这样的。 我已经序列化了存储在文件中的二进制Java对象。 我需要用C ++重构对象并进行进一步处理。

我想我可以使用Java反序列化Java对象,再次序列化为acsii文件,然后加载C ++代码。 另外,我知道可以使用JNI从C ++调用Java函数,但我不知道如何传递参数,即将对象返回给C ++。 但有更好的方法吗?

谢谢!

如果您觉得足够勇敢,可以查看Java序列化规范并为Java序列化数据编写C ++解析器。

JNI路由可行,但您最终得到的是Java对象,而不是C ++对象。 因此,您的C ++代码基本上必须对VM进行大量调用才能操作该数据(尽管您只需要获取对象的字段并将其复制到C ++对象中)。

如果在C ++中编写Java unmarshaler听起来很麻烦,你可以按照自己的建议去做,编写一个Java程序,将数据写入一种可以从C ++轻松解析的格式。 但是现在你正在编写一个封送器(在Java中),如果你没有,那么就是一个unmarshaler(在C ++中),所以也许只是解析Java序列化格式会更容易。

可能你可以用Java编写程序来读取(反序列化)这些对象,然后使用Protobuf(http://code.google.com/p/protobuf/)将它们序列化为某个文件,并且可以将其反序列化为C ++对象。

您可以直接打开序列化文件并从C ++中获取数据。 您可以看到规范,但我建议您开始阅读像Java序列化算法所揭示的文章。

但对我而言更好的方法是再次在Java中加载对象并将其序列化为其他格式,例如使用google-gson等java库的JSON,然后将数据打开回C ++。

当一个对象被序列化为一个流时,它会丢失有关源语言的信息,实际上会变成一个与语言无关的数据。 所以你的问题不是从Java转换到C ++,而是将二进制blob数据转换为它在C ++中的对象表示。 确定blob是用Java序列化的,但这对于反序列化过程来说是无关紧要的。 现在您需要做的是在序列化时找出数据的格式,并用C ++编写代码以对其进行反序列化。 如果你很幸运,可能已经使用XML序列化完成了序列化,在这种情况下,使用C ++端的XML库对其进行反序列化是微不足道的。

虽然我不知道有什么方法可以做你所说的。 如果我在你的位置,我会将每个对象的描述写入文本/二进制文件。 然后让C ++读取描述并填写空白。

正如sashang所说,数据只是对象的转储,没有它由Java拥有。 如果你理解格式,你绝对可以用C ++反序列化数据。 虽然我不知道格式,但我想最好用Java去除它并将对象传回C ++。 您的代码将更加强大,您不必重新发明轮子。