当前位置: 首页 > 面试题库 >

在Android上使用MessagePack

薄腾
2023-03-14
问题内容

有人尝试过使用MessagePackAndroid应用程序吗?
可能吗?我试图从中使用Jar,msgpack-java并收到以下异常:

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.jarmsgpack-0.5.2.jarslf4j-api-1.6.2.jarslf4j-jdk14-1.6.2.jar在我的lib目录中。

在我的服务器应用程序中,此代码可以在相同的库中正常工作。


问题答案:

msgpack0.6.8可在Android上正常使用

msgpack-rpc0.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");

由于这个错误。

如果您想看一个简单的示例,下面是为此目的设置的两个项目:

  • 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应该与Android兼容(存在一个小的依赖项排除问题)。检查以下文本以获取msgpack-
rpc(将来可能还会改编)。

注意:如果您还使用 msgpack-rpc ,则需要执行以下步骤:

  1. 从 _git://github.com/msgpack/msgpack-rpc.git_ (特别是 “ java”文件夹 )下载msgpack-rpc源。
  2. 将主要msgpack工件版本更改为您已构建的版本。
  3. org.msgpack.rpc.loop.netty.NettyEventLoop中 ,将 NioClientSocketChannelFactory 更改为 OioClientSocketChannelFactory(getWorkerExecutor())
  4. 以与主MessagePack JAR相同的方式构建MessagePack-RPC(请参阅上面的 步骤11 )。

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

重要提示: 我仅测试了 同步 通信。异步可能不起作用。

这是msgpack在以下版本之前无法与Android配合使用的原因0.6.7

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

这是一个类似的问题所描述的一个这里,为此,一般的解决方案中概述这里。不幸的是,在我们的情况下,它需要重建msgpack。这就是我所做的(几乎可以肯定,您可以跳过第5步和第8步,但是我还没有尝试过):

  1. https://github.com/msgpack/msgpack-java.git 下载MessagePack源。
  2. 将MessagePack源作为项目导入到IDE中。
  3. http://svn.apache.org/repos/asf/harmony/enhanced/java/trunk/classlib/modules/beans/src/main/java 下载相关软件包的Apache Harmony源。
  4. 将这些包复制到MessagePack项目的 src / main / java 文件夹中:
    • java.beans
    • java.beans.beancontext
    • org.apache.harmony.beans
    • org.apache.harmony.beans.internal.nls
  5. 在您的MessagePack项目中,删除以下类:
    • PropertyChangeListener
    • IndexedPropertyChangeEvent
    • PropertyChangeEvent
    • PropertyChangeListenerProxy
    • 物业变更支持
  6. java.beans 包重命名为其他名称,例如 custom.beans
  7. 所有 java.beans 引用更改为重命名的ID,然后再次更改,例如 custom.beans 。这 尤其 适用于 BeansFieldEntryReader (此类是原始错误的原因)。
  8. 将在 步骤5中* 删除的五个类的 custom.beans 引用更改回 java.beans* __
  9. org.apache.harmony.beans.internal.nls.Messages 类中,注释掉 setLocale 方法,并删除与之关联的导入。
  10. 删除所有仍然有错误的类, Encoder 除外 。在该类中,注释掉对已删除类的所有引用。您现在应该有一个没有错误的项目。
  11. 构建MessagePack JAR:
    • 如果您使用的是Maven,请将pom.xml中的版本更改为唯一的版本,运行具有 安装 目标的Maven build ,然后 使用该版本 在您的Android项目中添加依赖项。
    • 如果您 使用Maven,则必须使用随附的 build.xml 为Ant 运行 jar 目标。用这个替换您的Android项目中的msgpack JAR。 __
  12. 如果要发布应用程序,请记住包括有关Apache Harmony的相关法律声明。就像MessagePack一样,这是Apache许可。

那应该做。使用您的示例代码和我自己的数据类,我能够成功打包和解压缩数据。

整个重命名仪式归因于DEX编译器抱怨java。*包命名的事实。



 类似资料:
  • 我有一些用RNCryptor加密的图像文件,我想对它们进行解密,并将它们用作框架布局的背景。我浏览了示例文件,但我的应用程序force在一段时间后关闭,没有显示任何图像。我使用JNCryptor库 我将加密图像放入raw文件夹,如下所示: 这是我活动中的代码: 这个文件可以很好地iOS这个代码: 这里是logcat输出: 08-2819:52:11.720:E/AndroidRuntime(106

  • 我想实现与以下2个请求旋转: 1。在显示选择项列表时,文本如下图所示左对齐。4. 2。在选择一个项目后,我想让所选的一个显示右对齐,如下图所示。 我的旋转器布局旋转器布局如下: 和适配器的getView如下所示: 但是,如果将行改为. 将显示为picture.3和picture.4. 如何修改以同时到达picture.1和picture.4?

  • 问题内容: 在浏览Android WebView文档时遇到了ServiceWorkerController,并决定尝试一下。不幸的是,我无法截获任何电话。我知道WebViewClient.shouldInterceptRequest,但有兴趣了解有关ServiceWorkerController的更多信息。不幸的是,这些文档比我下面已经实现的稀疏。任何帮助,将不胜感激。 我整理了一个由单个Acti

  • 问题内容: 有没有人有关于在SQLite中从Android上的libGDX存储数据的任何提示。我对Android SDK中使用的技术非常熟悉,但是我不知道如何从libGDX调用这些Android数据库函数。我知道从libGDX调用函数会使我的游戏无法在桌面上使用,但是我可以解决这个问题。 问题答案: 一种方法总是在您的主项目中创建一个界面,我们称它为。然后,让桌面和Android应用程序/活动都实

  • 问题内容: 我在Android的OpenGL-ES 3.0中使用的工作代码如下所示: 我的问题是在第三行上将结果转换为to 。被声明为返回一个: 在我的测试平台上,该函数返回的子类,因此强制转换有效,但对于支持OpenGL-ES 3+的所有平台或Android版本进行此假设似乎并不十分安全。尽管看起来很合理,但我还没有找到任何可以保证它的文档,如果可以保证,似乎应该将该函数声明为returning

  • 问题内容: 我正在尝试在Android的Java应用程序中使用Mozilla Rhino 评估一些JavaScript。我正在使用Eclipse + ADT插件。 首先,我尝试仅从Mozilla的网站下载Rhino .jar文件,并将其作为Eclipse中的库添加到项目中。Eclipse很好地识别了它并编译了该应用程序。但是,在运行它时,调用时会出现异常(有关堆栈跟踪,请参见下文)。 然后,我尝试