2016-08-19 6 views
0

ArraList<MyClass>を内部ストレージに保存します。ですから、ArrayListとMyClassを持つクラスにSerializableを実装しました。コードは次のようになります。シリアル化されたArrayListを保存すると、AndroidでNotSerializableExceptionがスローされる

public class CustomAdapter extends BaseAdapter implements Serializable { 
public ArrayList<TaskItems> taskList = new ArrayList<TaskItems>(); 
// some fields and variables 
// some methods which use below method saveFile() 
public void saveFile() { 
    try { 
     String filename = "daytodaytasks"; 
     FileOutputStream fileOutputStream = mContext.openFileOutput(filename, Context.MODE_PRIVATE); 
//mContext is MainActivity context 
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); 
     objectOutputStream.writeObject(taskList); 
     objectOutputStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
class TaskItems implements Serializable { 
    String smallRectUpText; 
    String smallRectDownText; 
    String bigRectText; 
    } 
} 

クラスには、saveFile()メソッドを使用するメソッドがあります。すべてのメソッドは、クラス参照を使用してMainActivity onClick()メソッドから呼び出されます。私は、プログラムを実行し、ボタンを押してのonClickメソッドを使用するとき、私は得る:

java.io.NotSerializableException: com.something.MainActivity 

だから私はMainActivityにSerializableを実装しようとしたが、その後私はMainActivityが延びAppCompatAcitvity、から同じ例外が発生しました。私たちを手伝ってくれますか ?

答えて

1

ContextオブジェクトはSerializableではありません。

クラスTaskItemsは静的ではないためCustomAdapter.thisBaseAdapterオブジェクトにアクセスできます。このオブジェクトにはContextオブジェクトが含まれています。 Serializableインタフェースをサポートしていません。あなたは、シリアライズBaseAdapterを作ったとき、それはグラフを横断するときjava.io.NotSerializableException: com.something.MainActivity

Java Doc states

を示し始めた理由は、オブジェクトに遭遇することができることを

。この場合、NotSerializableExceptionがスローされ、非直列化可能オブジェクトのクラスが識別されます。

TaskItemsを静的クラスにすると、静的コンテキストからはCustomAdapter.thisにアクセスできなくなります。

+0

これは動作しますが、なぜTaskItemsクラスがCustomAdapterにアクセスするのか分かりません。それは文脈へのいかなる参照も持たない。 – Michal

+0

クラスTaskItemsは内部クラスなので、CustomAdapterを使用して外部クラスメンバ変数にアクセスできます。クラスTaskItemsを静的にすることによって、外部クラスのメンバ変数へのアクセスを防ぎます。 – Raman

関連する問題