【问题标题】:How to convert a Java object into a C++ object?如何将 Java 对象转换为 C++ 对象?
【发布时间】:2011-05-26 08:24:04
【问题描述】:
我的问题是这样的。我已经序列化了存储在文件中的二进制 Java 对象。我需要用 C++ 重构对象并做进一步的处理。
我想我可以使用 Java 反序列化 Java 对象,再次序列化为 acsii 文件,然后加载 C++ 代码。另外,我知道可以使用 JNI 从 C++ 调用 Java 函数,但我不知道如何传递参数,即将对象返回给 C++。但是有没有更好的方法?
谢谢!
【问题讨论】:
标签:
java
c++
serialization
【解决方案1】:
如果你有足够的勇气,你可以看看 Java 序列化specification 并为 Java 序列化数据编写一个 C++ 解析器。
JNI 路由有效,但最终得到的是 Java 对象,而不是 C++ 对象。因此,您的 C++ 代码基本上必须对 VM 进行大量调用才能操作该数据(尽管您可以这样做只是为了获取对象的字段并将它们复制到 C++ 对象中)。
如果用 C++ 编写 Java 解组器听起来很麻烦,您可以按照自己的建议编写一个 Java 程序,将数据写入您可以从 C++ 轻松解析的格式。但是现在您正在编写一个 marshaler(在 Java 中)和一个 unmarshaler(在 C++ 中),如果没有的话,那么也许只解析 Java 序列化格式会更容易。
【解决方案2】:
也许您可以用 Java 编写一个程序来读取(反序列化)这些对象,然后使用 Protobuf (http://code.google.com/p/protobuf/) 将它们序列化到某个文件,然后可以将其反序列化为C++ 对象。
【解决方案4】:
当一个对象被序列化为流时,它会丢失有关源语言的信息,实际上变成了与语言无关的数据块。因此,您的问题不是从 Java 转换为 C++,而是将二进制数据块转换为 C++ 中的对象表示。当然,blob 是用 Java 序列化的,但这与反序列化过程无关。现在你需要做的是在数据被序列化时找出数据的格式,并用 C++ 编写代码来反序列化它。如果幸运的话,序列化可能是使用 XML 序列化完成的,在这种情况下,使用 C++ 端的 XML 库来反序列化它是微不足道的。
【解决方案5】:
虽然我不知道有什么方法可以做到你所说的。如果我处于你的位置,我会将每个对象的描述写入文本/二进制文件。然后让 C++ 阅读描述并填空。
【解决方案6】:
正如 sashan 所说,数据只是对象的转储,不存在它属于 Java 的东西。如果您了解格式,您绝对可以在 C++ 中反序列化数据。虽然我不知道格式,但我想最好在 Java 中将其反序列化并将对象传递回 C++。您的代码会更加健壮,而且您不必重新发明轮子。
【讨论】:
-
-
定义你自己的消息格式并传递它。现在,我衷心推荐使用 Google 协议缓冲区 (code.google.com/p/protobuf),这是一种机制,您可以在其中以独立于平台和语言的方式定义消息,然后随意序列化和反序列化。因此,您将: 1) 反序列化 Java 中的当前格式。 2) 将数据复制到 protobuf 消息中。 3)将其序列化为数组(或字符串)。 4)将其传递给C++。 5) 在 C++ 中反序列化消息。 6) 使用 C++ protobuf 消息作为您的 C++ 对象,或者将数据复制到您定义的任何 C++ 对象。