2012-09-21 4 views
1

그래서 여기에이 코드가 있습니다.Android : onRecieve의 의도 getSerializableExtra (문자열 키)가 null을 반환합니다.

myIntent.putExtra("schedule",serializableClass); 

이 의도 내 브로드 캐스트 리시버로 이동하고 난 아래와 같이 그 직렬화 얻었다,

public void onRecieve(Context context, Intent intent) 
{ 
    Schedule s = (Schedule) intent.getSerializableExtra("schedule"); 
} 

하지만 항상 내가 엑스트라를 넣을 때의 NOT NULL, 심지어 전달하기 전에 확인에도 불구하고 반환 그것 on myIntent.putExtra() 나는 정말로 무슨 일이 일어날 지 모르지만, 왜 항상 null을 반환합니까? ... 아무도이 문제를 알고 있습니까?

+1

은 Serializable을 구현하고 있습니까? –

+0

그래, 내 모든 클래스는 직렬화 할 수있다 – lemoncodes

답변

1

캐스트가 잘못되었습니다. 직렬화 된 문자열을 전달하고 역 직렬화를 수행하는 것이 더 쉬울 것입니다. 이 클래스를 사용하고 있습니다. 이 같은 것을 사용 후

public final class ObjectSerializer { 

    private ObjectSerializer() { 

    } 

    public static String serialize(Serializable obj) throws IOException { 
     if (obj == null) 
      return ""; 
     try { 
      ByteArrayOutputStream serialObj = new ByteArrayOutputStream(); 
      ObjectOutputStream objStream = new ObjectOutputStream(serialObj); 
      objStream.writeObject(obj); 
      objStream.close(); 
      return encodeBytes(serialObj.toByteArray()); 
     } catch (Exception e) { 
      throw new IOException("Serialization error: " + e.getMessage(), e); 
     } 
    } 

    public static Object deserialize(String str) throws IOException { 
     if (str == null || str.length() == 0) 
      return null; 
     try { 
      ByteArrayInputStream serialObj = new ByteArrayInputStream(
        decodeBytes(str)); 
      ObjectInputStream objStream = new ObjectInputStream(serialObj); 
      return objStream.readObject(); 
     } catch (Exception e) { 
      throw new IOException("Serialization error: " + e.getMessage(), e); 
     } 
    } 

    public static String encodeBytes(byte[] bytes) { 
     StringBuffer strBuf = new StringBuffer(); 

     for (int i = 0; i < bytes.length; i++) { 
      strBuf.append((char) (((bytes[i] >> 4) & 0xF) + ('a'))); 
      strBuf.append((char) (((bytes[i]) & 0xF) + ('a'))); 
     } 

     return strBuf.toString(); 
    } 

    public static byte[] decodeBytes(String str) { 
     byte[] bytes = new byte[str.length()/2]; 
     for (int i = 0; i < str.length(); i += 2) { 
      char c = str.charAt(i); 
      bytes[i/2] = (byte) ((c - 'a') << 4); 
      c = str.charAt(i + 1); 
      bytes[i/2] += (c - 'a'); 
     } 
     return bytes; 
    } 

} 

:

String scheduleSerialization = ObjectSerializer.serialize(schedule); 
myIntent.putExtra("schedule",scheduleSerialization); 

마지막 일을 할 수있다 :이 느리기 때문에 안드로이드에 직렬화 사용

public void onRecieve(Context context, Intent intent) 
{ 
    String serial = intent.getStringExtra("schedule"); 
    if(serial!=null) 
    Schedule s = (Schedule) ObjectSerializer.deserialize(serial) ; 
} 
+0

hmmmm 조금 힘들지 만 그것을 시도 할 것이다. btw는 다른 어떤 방법으로도 직렬화 할 수 있으며, 객체를 의도를 통해 수신자에게 전달할 수 있는가? .. 제발 공유한다. – lemoncodes

+0

btw i 내 코드의 다른 부분에서이 작업을 시도했지만 null을 반환하지는 않지만 그 부분에서이 코드를 어디에 놓을 까? 이것은 내가 serailize하지 않았기 때문이다.> – lemoncodes

0

이 좋습니다. 당신이 안드로이드 소스 코드를 보면 당신은

  • 때이 할 수없는 (.. 등 정수, 문자열,)

    • 는 일반적으로 여러 키에 정보를 무너 뜨리는 것을 볼과 같은 기본 유형을 보내드립니다 행해지면, Parcelable 객체를 사용합니다.
  • +0

    그래서 Parcelable이 최선의 사용이라고 말하는가? – lemoncodes

    +0

    Parcelable이 Serializable보다 낫습니다. 하지만 내 대답은 "작은"객체 및 객체의 구성이 없다면 객체의 인스턴스 변수를 번들의 다른 기본 요소 (putStringExtra, putIntegerExtra ...)에 쓰는 것이 좋습니다. –

    +0

    ohhh 작성 또는 전달 객체의 멤버)는 하나씩 전체적으로 전달하는 것보다 낫습니다. – lemoncodes

    관련 문제