gpt4 book ai didi

java - 在 Android 上使用 MessagePack

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:02:17 24 4
gpt4 key购买 nike

有人试过用MessagePack使用 Android 应用程序?
有可能吗?我曾尝试使用来自 msgpack-java 的 Jar并收到以下异常:

Caused by: java.lang.ExceptionInInitializerError
at org.msgpack.Packer.pack(Packer.java:532)
at org.msgpack.MessagePack.pack(MessagePack.java:31)
... 15 more
Caused by: java.lang.ExceptionInInitializerError
at org.msgpack.template.TemplateRegistry.<clinit>(TemplateRegistry.java:38)
... 17 more
Caused by: java.lang.VerifyError: org.msgpack.template.BeansFieldEntryReader
at org.msgpack.template.builder.BeansTemplateBuilder.<init (BeansTemplateBuilder.java:42)
at org.msgpack.template.builder.BuilderSelectorRegistry.initForJava(BuilderSelectorRegistry.java:73)
at org.msgpack.template.builder.BuilderSelectorRegistry.<clinit>(BuilderSelectorRegistry.java:38)
... 18 more

我使用的代码非常简单
PrintWriter out = new PrintWriter(socket.getOutputStream());
Message msg = new Message();
msg.body = "asdasdasd";
msg.from = "qwe";
msg.to = "ttt";
byte[] bytes = MessagePack.pack(msg);
out.print(bytes);
out.flush();

我有 javassist.jar , msgpack-0.5.2.jar , slf4j-api-1.6.2.jarslf4j-jdk14-1.6.2.jar在我的 lib目录。

在我的服务器应用程序中,这段代码与相同的库一起工作得很好。

最佳答案

(希望)最终更新

msgpack :0.6.8适用于 Android 没有任何问题

msgpack-rpc : 0.7.0 可在 Android 上运行,但有一个警告。

具体需要在onCreate中添加以下内容对于 API 级别 8 (Android 2.2.1),可能更低:

java.lang.System.setProperty("java.net.preferIPv4Stack", "true");
java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");

由于 this bug .

如果你想看一个简单的例子,这里有两个为此目的设置的项目:
  • https://github.com/mikkoz/msgpack-android-test-server/tree/master/msgpack-android-test-server
  • https://github.com/mikkoz/msgpack-android-test-client/tree/master/msgpack-android-test-client


  • 以前的版本

    更新:截至 0.6.7 msgpack should be compatible with Android (有一个小的依赖排除问题)。检查下面的 msgpack-rpc 文本(将来也可能会改编)。

    注意:如果您还使用 msgpack-rpc,则需要执行以下步骤:
  • 从 git://github.com/msgpack/msgpack-rpc.git(特别是 “java”文件夹 )下载 msgpack-rpc 源。
  • 将主要的 msgpack 工件版本更改为您构建的版本。
  • 在 org.msgpack.rpc.loop.netty.NettyEventLoop 中,将 NioClientSocketChannelFactory 更改为 OioClientSocketChannelFactory(getWorkerExecutor())。
  • 以与主 MessagePack JAR 相同的方式构建 MessagePack-RPC(参见上面的步骤 11)。

  • NettyEventLoop 替换是由于这个问题:
    http://markmail.org/message/ypa3nrr64kzsyfsa .

    重要提示:我只测试过 同步 沟通。异步可能不起作用。

    这就是 msgpack 在 0.6.7 之前无法与 Android 一起使用的原因:

    错误的原因是 MessagePack 使用了 Android SDK 中未包含的几个 java.beans 类。您可能正在使用 MessagePackBeans 批注。

    这与 here 中描述的问题类似,概述了一般解决方案 here .不幸的是,在我们的例子中,它需要重建 msgpack。这是我所做的(您几乎可以肯定跳过第 5 步和第 8 步,但我没有那样尝试过):
  • https://github.com/msgpack/msgpack-java.git 下载 MessagePack 源.
  • 将 MessagePack 源作为项目导入到您的 IDE 中。
  • http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/beans/src/main/java 下载相关包的 Apache Harmony 源代码.
  • 将这些包复制到 MessagePack 项目的 src/main/java 文件夹中:
  • java.beans
  • java.beans.beancontext
  • org.apache.harmony.beans
  • org.apache.harmony.beans.internal.nls
  • 在您的 MessagePack 项目中,删除以下类:
  • PropertyChangeListener
  • IndexedPropertyChangeEvent
  • PropertyChangeEvent
  • PropertyChangeListenerProxy
  • 属性(property)变更支持
  • 将 java.beans 包重命名为不同的名称,例如自定义 bean 类。
  • 更改 全部 java.beans 对重命名的 ID 的引用,所以再次例如自定义 bean 类。这适用 特别是到 BeansFieldEntryReader (这个类是原始错误的原因)。
  • 更改您在 中删除的五个类的 custom.beans 引用步骤 5 回到java.beans。
  • 在 org.apache.harmony.beans.internal.nls.Messages 类中,注释掉 setLocale 方法,并删除与其关联的导入。
  • 删除所有仍然有错误的类,除了 编码器。在该类中,注释掉对已删除类的所有引用。您现在应该有一个没有错误的项目。
  • 构建 MessagePack JAR:
  • 如果您使用 Maven,请将 pom.xml 中的版本更改为唯一的版本,使用安装目标运行 Maven 构建,然后在您的 Android 项目中添加依赖项 使用那个版本 .
  • 如果您是 不是 使用 Maven,您必须使用包含的 build.xml 运行 Ant 的 jar 目标。用这个替换你的 Android 项目中的 msgpack JAR。
  • 如果您要发布应用程序,请记住包含 Apache Harmony 的相关法律声明。它是一个 Apache 许可证,就像 MessagePack 一样。

  • 那应该这样做。使用您的示例代码和我自己的数据类,我成功地打包和解包数据。

    整个重命名仪式是由于 DEX 编译器提示 java.* 包命名这一事实。

    关于java - 在 Android 上使用 MessagePack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7529522/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com