2012-10-17 4 views
3

메시지 팩을 android에서 사용하면 클래스를 직렬화/역 직렬화 할 수 있지만 절대적으로 맞지는 않습니다. .MessagePack 안드로이드에서 객체 에러가 발생했습니다.

간단한 테스트 클래스 :

@Message 
public class Account { 

    public String Code; 
    public int Sequence; 
    public float Lot; 

    public String toString(){ 
     return "Seq:"+Sequence; 
    } 
} 

테스트 코드 :

MessagePack msgpack = new MessagePack(); 
    msgpack.register(Account.class); 
    try { 
    Account a = new Account(); 
    a.Code ="name"; 
    a.Sequence = 105; 
    a.Lot = (float)1.05; 
    byte[] b = msgpack.write(a); 
    //byte[] c = MessagePack.pack(a); 
    Account aa = msgpack.read(b, Account.class); 
    System.out.println(new String(b)); 
    System.out.println("test00: aa.Lot "+aa.Lot); 
    }catch(IOException e){ 
     e.printStackTrace(); 
    } 

실행 한 후에 "바이트 [] B = msgpack.write (a);" [] B 출력 바이트 배열 안드로이드 (자바 비교)

[-109, -92, 110, 97, 109, 101, 105, -54, 63, -122, 102, 102] on java 

[-109, -92, 110, 97, 109, 101, -54, 63, -122, 102, 102, 105] on android 

I 검토가 Using MessagePack with Android

답변

1

MessagePack하지 본질적 객체 직렬화이다 잘못. 잘 정의 된 데이터 구조를 직렬화하기위한 것입니다. Java에서는 객체의 필드 사이에 순서 개념이 없습니다. 이러한 MessagePack 구현물은 객체를 직렬화 및 비 직렬화 할 수 있도록 하나를 도입 할 것이지만 다른 시스템에서 동일하다는 보장은 없습니다. 휴대용 방법으로 객체를 직렬화하려면

["name", 105, 1.05] on Java 
["name", 1.05, 105] on Android 

는, 회원에 대한 잘 정의 된 순서로 특정 직렬화 방법을 쓰기 : 당신이 당신의 바이트 배열을 압축 해제하면

, 여기에 실제로 포함 된 것입니다 , 또는 객체에보다 가깝게 대응하는지도 유형을 사용할 수 있습니다.

이 여기에보고 된 버그입니다

참고 : MessagePack 자바 v0.6.7에서 http://jira.msgpack.org/browse/MSGPACK-51

+0

링크가 작동하지 않습니다. 이것은 여전히 ​​객체 순서의 경우입니까? –

+0

예, 그들은 오래된 bugtracker를 닫았습니다 ... 나는 문제가 여전히 존재한다고 생각합니다. 이를 고치는 방법은'@index' 주석을 사용하는 것입니다. https://github.com/msgpack/msgpack-java/issues/56 및 https://github.com/msgpack/msgpack-java/issues/98을 참조하십시오. – catwell

0

, 그것은 공식적으로 안드로이드를 지원합니다.

는 당신의 msgpack 라이브러리를 업그레이드하십시오 년 12 월 9 일 2012 년에 발표합니다.

+0

MessagePack-Java v0.6.11을 사용하고 있습니다. 안드로이드 및 내 맥 OSX 컴퓨터에 대한 결과. 이것에 대한 단서가 있습니까? – cpz

관련 문제