在Android上使用MessagePack
有人尝试过使用MessagePack
Android应用程序吗?
可能吗?我试图从中使用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.jar
,msgpack-0.5.2.jar
,slf4j-api-1.6.2.jar
和slf4j-jdk14-1.6.2.jar
在我的lib
目录中。
在我的服务器应用程序中,此代码可以在相同的库中正常工作。
回答:
(希望如此)最终更新
:0.6.8
可在Android上正常使用
: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");
由于这个错误。
如果您想看一个简单的示例,下面是为此目的设置的两个项目:
- 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
回答:
- 从 _git://github.com/msgpack/msgpack-rpc.git_ (特别是 )下载msgpack-rpc源。
- 将主要msgpack工件版本更改为您已构建的版本。
- 在 org.msgpack.rpc.loop.netty.NettyEventLoop中 ,将 NioClientSocketChannelFactory 更改为 OioClientSocketChannelFactory(getWorkerExecutor()) 。
- 以与主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步,但是我还没有尝试过):
- 从 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
- 物业变更支持
- 将 java.beans 包重命名为其他名称,例如 custom.beans 。
- 将 java.beans 引用更改为重命名的ID,然后再次更改,例如 custom.beans 。这 适用于 BeansFieldEntryReader (此类是原始错误的原因)。
- 将在 * __
- 在 org.apache.harmony.beans.internal.nls.Messages 类中,注释掉 setLocale 方法,并删除与之关联的导入。
- 删除所有仍然有错误的类, Encoder 。在该类中,注释掉对已删除类的所有引用。您现在应该有一个没有错误的项目。
- 构建MessagePack JAR:
- 如果您使用的是Maven,请将pom.xml中的版本更改为唯一的版本,运行具有 安装 目标的Maven build ,然后 在您的Android项目中添加依赖项。
- 如果您 使用Maven,则必须使用随附的 build.xml 为Ant 运行 jar 目标。用这个替换您的Android项目中的msgpack JAR。 __
- 如果要发布应用程序,请记住包括有关Apache Harmony的相关法律声明。就像MessagePack一样,这是Apache许可。
那应该做。使用您的示例代码和我自己的数据类,我能够成功打包和解压缩数据。
整个重命名仪式归因于DEX编译器抱怨java。*包命名的事实。
以上是 在Android上使用MessagePack 的全部内容, 来源链接: utcz.com/qa/422768.html