在Android上使用MessagePack

arb*_*uzz 10 java android messagepack msgpack

有人试图使用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
Run Code Online (Sandbox Code Playgroud)

我使用的代码非常简单

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();
Run Code Online (Sandbox Code Playgroud)

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

在我的服务器应用程序中,此代码可以使用相同的库.

mik*_*łak 13

(希望)最终更新

msgpack:0.6.8在Android上运行没有任何问题

msgpack-rpc:0.7.0适用于Android,但有一点需要注意.

具体来说,您需要onCreate为API Level 8(Android 2.2.1)添加以下内容,并且可能更低:

java.lang.System.setProperty("java.net.preferIPv4Stack", "true");
java.lang.System.setProperty("java.net.preferIPv6Addresses", "false");
Run Code Online (Sandbox Code Playgroud)

由于这个错误.

如果你想看一个简单的例子,这里有一对为此目的设置的项目:


之前的版本

更新:从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
    • 的PropertyChangeSupport
  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构建,然后使用该版本在Android项目中添加依赖项.
    • 如果您不使用Maven,则必须使用随附的build.xml运行Ant 的jar目标.用这个替换Android项目中的msgpack JAR.
  12. 如果您要发布应用程序,请记住包含Apache Harmony的相关法律声明.这是一个Apache许可证,就像MessagePack一样.

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

整个重命名仪式是由于DEX编译器抱怨java.*包命名.