mina-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alexander Christian <a...@root1.de>
Subject Re: MINA's IoBuffer#getObject/putObject: DalvikVM<->JVM issues?
Date Tue, 23 Apr 2013 14:39:22 GMT
Hmm, no answer yet. So I have to investigate myself :-(

Here's what I found out so far:

1) Simple classes with primitive instance variables are not a problem 
for MINA. Works just fine.
2) Classes with objects don't work.


To test 2), I did the following:

I created this Test-Class which will be serialized later:

----
package de.root1.shared;

import java.io.Serializable;
import java.math.BigInteger;

public class MyClass implements Serializable {

     private static final long serialVersionUID = 123L;

     private long i = 0;
     private BigInteger bigInt;
     private final String string;

     public MyClass(long i, String bigint, String string) {
         this.i = i;
         this.bigInt = new BigInteger(bigint);
         this.string = string;
     }

     public long getI() {
         return i;
     }

     @Override
     public String toString() {
         return "MyClass{" + "i=" + i + ", bigInt=" + bigInt.longValue() 
+ ", string=" + string + '}';
     }

}
----

... and executed the following code to serialize an object of this class 
once on Android 4.2.2 and once on JVM:

----
             Long l = 26495472873L;
             MyClass mc = new MyClass(l, "1234567890", "Hello World:" + l);
             IoBuffer ioBuffer = IoBuffer.allocate(1024 * 10);

             ioBuffer.putObject(mc);
             ioBuffer.flip();

             StringBuilder sb = new StringBuilder();
             while (ioBuffer.position() < ioBuffer.limit()) {
                 sb.append(ioBuffer.get()).append("|");
             }
             System.out.println("buffer: " + sb.toString());
----

I expected that both platforms would create the same output. But it's 
different:

JVM 1.7u21 64bit
buffer: 
0|0|0|-102|-84|-19|0|5|115|114|1|0|23|100|101|46|114|111|111|116|49|46|115|104|97|114|101|100|46|77|121|67|108|97|115|115|120|112|0|0|0|6|43|64|-44|-23|115|114|1|0|20|106|97|118|97|46|109|97|116|104|46|66|105|103|73|110|116|101|103|101|114|120|114|1|0|16|106|97|118|97|46|108|97|110|103|46|78|117|109|98|101|114|120|112|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-2|-1|-1|-1|-2|0|0|0|1|117|114|1|0|2|91|66|120|112|0|0|0|4|73|-106|2|-46|120|116|0|23|72|101|108|108|111|32|87|111|114|108|100|58|50|54|52|57|53|52|55|50|56|55|51|

ANDROID 4.2.2 on Android-SDK-Emulator
buffer: 
0|0|0|-118|-84|-19|0|5|115|114|1|0|23|100|101|46|114|111|111|116|49|46|115|104|97|114|101|100|46|77|121|67|108|97|115|115|120|112|0|0|0|6|43|64|-44|-23|115|114|1|0|20|106|97|118|97|46|109|97|116|104|46|66|105|103|73|110|116|101|103|101|114|120|114|1|0|16|106|97|118|97|46|108|97|110|103|46|78|117|109|98|101|114|120|112|0|0|0|1|117|114|1|0|2|91|66|120|112|0|0|0|4|73|-106|2|-46|120|116|0|23|72|101|108|108|111|32|87|111|114|108|100|58|50|54|52|57|53|52|55|50|56|55|51|

A lot of bytes are equal, but after a lot of bytes, there's a point 
where the JVM uses the following additional bytes: 
"-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-2|-1|-1|-1|-2|".

So the part before this substring, and the part after this substring is 
equal to the Android output...

On both systems, I don't get any exception.

Any ideas what goes wrong?

br,
Alex






Am 23.04.2013 11:47, schrieb Alexander Christian:
> Hi there,
>
> a few months ago, I asked this list if someone uses MINA for 
> communication between Android (DalvikVM) + Java (Oracle JVM), 
> especially with regard to built-in object serialization
>
> This was the answer (forget to copy also the author's name ...):
> ----
>
> Yes, MINA works on Android!
>
> I have been using it to develop a publish/subscribe system that 
> supports Android clients. I think you won't be able to use built-in 
> serialization, though. Dalvik is not a standard JVM...
>
> Other than that, I've had no issues.
>
> My deployments include Android 2.3 and Android 4.1 using Nexus S 
> smartphones and the latest version of MINA. In fact, I think they are 
> a great combination...
>
> ----
>
> Today I tested my application (which is a kind of RMI replacement, see 
> http://dev.root1.de/projects/simon and makes heavy use of 
> serialization via IoBuffers#getObject/putObject) with Android 4.2.2 
> (via Android SDK Emulator). Result: Serialization works... At least 
> with simple classes like:
>
> ----
> package de.root1.shared;
>
> import java.io.Serializable;
>
> public class MyClass implements Serializable {
>
>     private long i = 0;
>
>     public MyClass(long i) {
>         this.i = i;
>     }
>
>     public long getI() {
>         return i;
>     }
>
>     @Override
>     public String toString() {
>         return "MyClass{" + "i=" + i + "}@"+hashCode();
>     }
>
> }
> ----
>
> For now, I did not test complex classes. But I assume that this will 
> also work.
>
> So: Great. Serialization works. But why? I read that it is not 
> working? I found a lot of resources on the net talking about other 
> ways of serialization and ways around this issue...
>
> Is there someone on this list who can confirm that serialization 
> between DalvikVM and JVM with help of MINAs 
> IoBuffer#putObject/getObject is not an issue at all?
> My gurrent guess is, that serialization between both platforms became 
> compatible with Android Version XYZ ... Would be good to know which 
> version this was...
>
> Any comments/ideas?
>
> br,
> Alex
>


Mime
View raw message