【问题标题】: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++ 对象。

      【讨论】:

        【解决方案3】:

        您可以直接打开序列化文件并从 C++ 中获取数据。您可以查看规范,但我建议您开始阅读 The Java serialization algorithm revealed 之类的文章。

        但更简单且对我来说更好的方法是再次在 Java 中加载对象并将其序列化为其他格式,例如带有 google-gson 或其他 Java 库的 JSON,然后将数据打开回 C++。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              【解决方案6】:

              正如 sashan 所说,数据只是对象的转储,不存在它属于 Java 的东西。如果您了解格式,您绝对可以在 C++ 中反序列化数据。虽然我不知道格式,但我想最好在 Java 中将其反序列化并将对象传递回 C++。您的代码会更加健壮,而且您不必重新发明轮子。

              【讨论】:

              • 如何将Java对象传回C++?
              • 定义你自己的消息格式并传递它。现在,我衷心推荐使用 Google 协议缓冲区 (code.google.com/p/protobuf),这是一种机制,您可以在其中以独立于平台和语言的方式定义消息,然后随意序列化和反序列化。因此,您将: 1) 反序列化 Java 中的当前格式。 2) 将数据复制到 protobuf 消息中。 3)将其序列化为数组(或字符串)。 4)将其传递给C++。 5) 在 C++ 中反序列化消息。 6) 使用 C++ protobuf 消息作为您的 C++ 对象,或者将数据复制到您定义的任何 C++ 对象。
              猜你喜欢
              • 1970-01-01
              • 2023-03-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-24
              • 1970-01-01
              • 2016-04-24
              相关资源
              最近更新 更多