2011-11-22 8 views
5

少し問題があります: 私はアンドロイド(Eclipseを使用して)でシリアル化をテストしたいと思います。 シリアライズしたいクラスで "Serializable"を実装する必要があることはわかっています。私は既にそれを行い、常にjava.io.NotSerializableException例外を取得します。java.io.NotSerializableException私が "Serializable"を実装していても

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を見てください。おそらくあなたが使いたいものでしょう。 – blindstuff

+0

が下記のように応答/コメントされた場合、 'Button(null)'を呼び出すことは期待どおりに動作しています:いいえ例外と 'res'で正しい値を取得しています。環境でなければなりません... –

+0

これはどうやってテストしていますか? Amulatorを使用していますか?実際のデバイスに展開していますか?エミュレータ/ 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(つまりシリアライズ可能な実装)である必要があります。

例外メッセージは、このような非直列化可能な依存関係が存在するかどうかを教えてください:

それは何かを言うべきだ「java.io.NotSerializableException:NonSerializableClassName」

更新:Bozhoさんのコメントのとおり、私はdidnのを実際にあなたのクラスは直列化不可能な依存関係を持たないことに注意してください。

+0

彼はそこに浮動小数点を持っています – Bozho

+0

うん、私の悪い、私は一番下までスクロールせず、 "ser"クラスもそこにあるのを見なかった。私はこれを反映するために私の答えを更新します。 –

+0

また、クラスをシリアライズする別の方法がありますか? 私がしたいのは、bluetoothでこのようなクラスを送信することです。バイト配列のみを許可します... – 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? 内部クラスは静的ではないため、直列化されたものとして存在するためには、外部クラスのインスタンスが必要であり、アクティビティは直列化されません。 Testerを別のクラスにするか、静的な内部クラスにします。

0

古い質問ですが、私は最近同様の問題があったので私の解決策を追加します。

ソリューションでは、クラスserがネストされたクラスでないことを確認してください。クラスが実装されていない直列化された親クラスにネストされている場合、組み込みのJava直列化はエラーなしで失敗します。

serクラスの実装を自分のファイルser.javaに移動すると、シリアル化が機能するはずです。

0

私はこれで頭を壊しました。 問題私のコードは、新しいオブジェクトを書き込む前に私の.serファイルを削除していないということでした。私の目的は、配列のArrayListを作成(シリアル化)し、それらを逆シリアル化することです。私は新しい場所を取得するときにこれを行う。オブジェクトを追加できなかったので、完全なリストを書くことにしました。新しいリストを書き込む前に毎回.serファイルを削除する必要があります。実際の問題を指摘していないことを示すエラーです。 -serを書き始める前に、-serをきれいにして清潔にしてください。

0

私はちょっと遅かったと知っていますが、あなたのクラスの先頭にprivate static final long serialVersionUID = 7536482295622776147L;のようなものがあることに気付きました(問題はありませんが、役立つかもしれません)ので:

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; 
} 

はもう一度、私は少し遅れてんだけど、この質問は、ビューの数千を持っている、とあなたは答えを選んしていない、ので、多分これは誰かに役立ちます。

関連する問題