2011-11-22 3 views
5

조금 문제가 있습니다 : Eclipse (Eclipse를 사용하여)에서 직렬화를 테스트하고 예제를 발견했습니다. serialize하려는 클래스에서 "Serializable"을 구현해야한다는 것을 알고 있습니다. 이미 그렇게했으며 항상 java.io.NotSerializableException 예외가 발생합니다."Serializable"을 구현하더라도 java.io.NotSerializableException

public void Button(View view) throws IOException, ClassNotFoundException { 
ser test = new ser(); 
    test.x = 204; 
    test.y = 2843; 
    test.speed = 12; 
    test.direction = 1343; 
    test.a = 493; 
    test.b = 2323; 
    test.c = 29489; 
    test.d = 394; 

    byte[] arr = serialize(test); 

    ser res = (ser) deserialize(arr); 
} 


public static byte[] serialize(Object o) { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try { 
     ObjectOutput out = new ObjectOutputStream(bos);  
     out.writeObject(o);          //This is where the Exception occurs 
     out.close();  
     // Get the bytes of the serialized object  
     byte[] buf = bos.toByteArray(); 
     return buf;  
    } catch(IOException ioe) { 
     Log.e("serializeObject", "error", ioe);   //"ioe" says java.io.NotSerializableException exception 
     return null; 
    } 

} 


public static Object deserialize(byte[] b) { 
     try {  
      ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(b));  
      Object object = in.readObject();  
      in.close(); 
      return object; 
     } catch(ClassNotFoundException cnfe) { 
      Log.e("deserializeObject", "class not found error", cnfe); 
      return null; 
     } catch(IOException ioe) { 
      Log.e("deserializeObject", "io error", ioe);  
      return null; 
     } 
    } 

class ser implements Serializable { 
    float x, y, speed, direction, a, b, c, d; 
} 

나는 내가 뭘 잘못했는지 모르겠어요, 당신이 날 도울 수 있기를 바랍니다 ...

편집 : 여기 코드는 내 수입은 다음과 같습니다

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutput; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.TextView; 
+0

Android Parcelables를 살펴보세요. 실제로 Android Parcelables를 사용하고 싶습니다. – blindstuff

+0

이 아래와 같이 응답/주석 처리되면'Button (null)'호출은 예상대로 작동합니다 : 예외는없고'res'에서 올바른 값을 얻습니다. 환경이어야합니다 ... –

+0

어떻게 테스트 하시겠습니까? 앰프를 사용합니까, 실제 장치에 전개합니까? 어떤 버전의 에뮬레이터/Android를 사용하고 있습니까? 서로 다른 Android 화신 (Cyanogen vs Stock Android 등)에는 차이가 있습니다. –

답변

6

유일한 것은 제가 생각할 수있는 것은 여러분이 실행중인 클래스가 여러분이 작성한 클래스가 아니라는 것입니다. 당신은 최신 버전을 컴파일하지 않았습니다.

간단한 Java 프로그램으로 문제를 재현 할 수 없습니다.

처음에는 java.io.Serializable이 아닌 sunw.io.Serializable을 구현했을 수도 있지만 io 클래스는 확장되어 있기 때문에 처음부터 제대로 작동해야한다고 생각했습니다.

+0

+1 좋은 점은 하나 이상의 Serializable 인터페이스가 있다는 것입니다. –

+0

sunw.io.Serializable는 java.io.Serializable을 확장하므로 해당 점 – Bozho

+0

을 편집하고 있습니다 (해당 Serializables와 함께). –

7

글쎄, 당신의 직렬화 가능 객체는 다른 직렬화 불가능 객체에 어떤 영향을 미치나요? 그렇다면 java.io.NotSerializableException이 발생합니다. 직렬화 할 수 있으려면 클래스 구현이 Serializable이고 모든 종속성이 Serializable (즉 Serializable 구현) 유형이어야합니다.

예외 메시지는 비 직렬화 의존성이 존재하는 경우를 말해야한다 :

이 같은 말을한다 "java.io.NotSerializableException : NonSerializableClassName"

업데이트 : Bozho의 의견에 따라, I didn를을 사실, 클래스에는 직렬화 가능하지 않은 종속성이 없습니다.

+0

그는 거기에 수레가 있습니다 – Bozho

+0

네, 내 나쁜, 나는 아래쪽으로 줄곧 스크롤하지 않았고, "ser"클래스도 거기에 있다는 것을 보지 못했습니다. 나는 그것을 반영하기 위해 나의 대답을 업데이트 할 것이다. –

+0

또는 클래스를 직렬화하는 또 다른 방법이 있습니까? 내가 원하는 것은 블루투스와 같은 클래스를 보내고 바이트 배열 만 허용합니다 ... – user1059863

2

코드에서 명확하지 않습니다. 그러나 "ser"를 다른 계열화 할 수없는 클래스의 내부 클래스로 정의한 경우 (해당 경우에는 "Activity"가 아닌 계열화 가능) 해당 부모 클래스를 직렬화 가능으로 정의하거나 "ser"를 다음과 같이 정의하지 마십시오. 내부 클래스.

Serialization of inner classes (i.e., nested classes that are not static member classes), including local and anonymous classes, is strongly discouraged for several reasons.

3

는 내가 모든 것을 이해할 수는 없지만, 아래 링크에서 해답을 가지고있다. why does this simple serializable object throw NotSerializableException? 내부 클래스가 정적이 아니기 때문에 직렬화 된 것으로 존재하기 위해서는 outter 클래스의 인스턴스가 필요하며 활동은 직렬화되지 않습니다. Tester를 별도의 클래스로 만들거나 정적 인 내부 클래스로 만듭니다.

0

이전 질문이지만 최근에 비슷한 문제가 있었기 때문에 내 솔루션이 추가되었습니다.

솔루션을 사용하려면 클래스 ser이 중첩 클래스가 아닌지 확인하십시오. 클래스가 구현되지 않은 직렬화 된 부모 클래스에 중첩되어 있으면 내장 된 Java 직렬화가 오류없이 실패합니다.

ser 클래스 구현을 자신의 파일 ser.java으로 옮기면 이제 직렬화가 작동합니다.

0

나는 이것으로 머리를 부러 뜨렸다. 문제 새 코드를 작성하기 전에 내 .ser 파일을 삭제하지 않고 코드를 작성해야했습니다. 내 목적은 (Serialize) 위치 ArrayList 및 deserialize 작성하는 것입니다. 이것은 새로운 위치를 얻었을 때하는 일입니다. 개체를 추가 할 수 없기 때문에 전체 목록을 작성하도록 선택 했으므로 새 목록을 작성하기 전에 매번 .ser 파일을 삭제해야합니다. 오류가 실제 문제를 가리키고 있지 않음을 나타냅니다. -ser를 작성하기 전에 -ser를 신선하고 깨끗하게 만드십시오.

0

나는 조금 늦었지만 클래스 상단에 private static final long serialVersionUID = 7536482295622776147L;과 같은 serialVersionUID가없는 것으로 나타났습니다 (문제는 아니지만 도움이 될 수도 있음) 변수 분리 시도 : 그래서, 그래서 어쩌면이 사람을 도움이 될 것입니다,

class ser implements Serializable { 
    private static final long serialVersionUID = 7536482295622776147L; 
    float x; 
    float y; 
    float speed; 
    float direction; 
    float a; 
    float b; 
    float c; 
    float d; 
} 

다시 한번, 나는 조금 늦게 해요,하지만이 질문은 뷰의 수천을 가지고, 당신은 대답을 포착하지 않았습니다.

관련 문제