2012-01-21 4 views
2

こんにちは私はsreen上のイメージの場所を内部ストレージに保存しようとしていますが、NotSerializableExceptionが発生します。私は検索して、問題がBitmapではないことを発見しましたこのリンクでシリアル化されるように設計されていますProblem serializing Drawable私は彼がどのように問題を解決したか理解できませんでした。誰かが、彼は彼の持つNotSerializableExceptionを修正する方法を説明し、私は私で得るのを助けることができれば、それは非常にjava.io.NotSerializableExceptionを修正する方法:android.graphics.Bitmap


をいただければ幸いです。ここここに私のElememtクラス

public class Element extends main implements Serializable{ 
private int mX; 
private int mY; 
int location2 ; 
Matrix elementlocation; 
private Bitmap mBitmap; 
Canvas canvas2; 

public Element(Resources res, int x, int y) { 
    location2 =item3; 
    mBitmap = BitmapFactory.decodeResource(res, location2); 
    mX = x - mBitmap.getWidth()/2; 
    mY = y - mBitmap.getHeight()/2; 
    } 

public Element(){ 

} 
public void doDraw2(Canvas canvas) { 
    elementlocation=new Matrix(); 
    elementlocation.postTranslate(mX,mY); 
    canvas2=canvas; 
    canvas2.drawBitmap(mBitmap, elementlocation,null); 
    } 
public void setelementlocation(float num1,float num2){ 
    elementlocation=new Matrix(); 
    elementlocation.postTranslate(num1,num2); 
} 
public Canvas getCanvas2(){ 
    return(canvas2); 
} 
public String toString() { 
    String sentence; 
    sentence= mBitmap+" "+mX+" "+mY; 
    return (sentence); 
} 

} 

は私のパネルで私onTouch方法でありますクラス

public boolean onTouchEvent(MotionEvent event) { 
    mainactivity=new main(); 
    Log.v("test", "you have touched the sreen: ");  

mElements.add(new Element(getResources(),(int) event.getX(),(int) event.get()));  
mainactivity.writeElement(new Element(getResources(),(int) event.getX(),(int) event.getY()),this.getContext()); 
     Log.v("Gesture", "is 1 "); 
     return super.onTouchEvent(event); 
} 

ここでは、私のメインクラスで私の書き込み要素法

public void writeElement(Element obj, Context context){ 
    Log.v("main", "made it to method writeElement"); 
    File f = new File(context.getFilesDir(),FILENAME); 
    try { 
fos = new FileOutputStream(f); 
    ObjectOutputStream objectwrite = new ObjectOutputStream(fos); 
    objectwrite.writeObject(obj); 
fos.close(); 
Log.v("main", "file was made File "); 

}catch (FileNotFoundException e){ 
    e.printStackTrace(); 
    Log.v("main", "file was not made File not found "); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    Log.v("main", "file was not made File IOException "); 
} 
} 

で更新

public Element(Resources res, int x, int y) { 
    location2 =item3; 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    mBitmap = BitmapFactory.decodeResource(res, location2); 
    mX = x - mBitmap.getWidth()/2; 
    mY = y - mBitmap.getHeight()/2; 
    mBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 


} 
+0

問題はBitmapだけでなく、CanvasとMatrixでも問題になります。これらのクラスのどちらも 'Serializable'ではありません。実際に何をしようとしていますか? –

+0

@PeterKnego私はそれを持っている人が画面に触れることができ、画面上にsomesortの画像を置くことができたが、彼がそれをドラッグすることができ、より多くのスペースを得ることができるように彼が置くすべての画像をドラッグすることができる私が行列を持っている理由。彼が望むものを作った後、彼は彼がやったことを保存するために彼が好きなので、私は内部ストレージに保存するキャンバスが必要です。それはあなたのqustionに答える?短いゲームでレベルのエディタを作ろうとしています –

答えて

2

あなたの問題だけではないBitmapでなく、CanvasMatrix。これらのクラスはどちらもSerializableです。

オブジェクト全体をシリアル化する必要はありませんが、関連するデータ(Matrix、もちろんBitmapなど)のデータのみをシリアル化する必要はありません。私はちょうど同じ問題に遭遇した

bmp.compress(Bitmap.CompressFormat.PNG, 90, outputStream); 

Matrix

// get matrix values 
float[] matrixValues = new float[9]; 
matrix.getValues(matrixValues); 

// float[] to byte[] 
ByteBuffer byteBuf = ByteBuffer.allocate(4 * array.length); 
FloatBuffer floatBuf = byteBuf.asFloatBuffer(); 
floatBuf.put(array); 
byte [] byte_array = byteBuf.array(); 

// write data 
outputStream.write(byte_array); 
+0

私はちょっと混乱していますが、要素クラスやメインクラスでは、あなたのビットマップの提案をtryedしましたが、何をtryしましたか? tryed –

8

:ビットマップを直列化するため

。 Peterが指摘するように、使用するいくつかのクラスはSerializableではありません。

Javaのデフォルトのメカニズムでは、シリアライズ可能とマークしたクラスをシリアライズし、transientとマークされていないすべてのフィールドを維持しようとします。 これらのフィールドの1つがではなく Serializable(android.graphics.Bitmapなど)の場合、ObjectOutputStream.writeObjectの呼び出しは失敗します。

これを回避するには、JavaがElementクラスをどのようにシリアライズするかを上書きする必要があります。 私のCachedBitmapクラスでは、次のコードを使用しました。 CanvasMatrixについては

package XXX; 

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 
import java.util.Date; 

import org.apache.commons.io.output.ByteArrayOutputStream; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 

public class CachedBitmap implements Serializable{ 

    private static final long serialVersionUID = -6298516694275121291L; 

    Date inserted; 
    transient Bitmap bitmap; 
    String url; 

    public CachedBitmap(){}; 

    public CachedBitmap(Bitmap b, Date insertionDate, String sourceUrl){ 
     bitmap = b; 
     inserted = insertionDate; 
     url = sourceUrl; 
    } 

    private void writeObject(ObjectOutputStream oos) throws IOException{ 
     // This will serialize all fields that you did not mark with 'transient' 
     // (Java's default behaviour) 
     oos.defaultWriteObject(); 
     // Now, manually serialize all transient fields that you want to be serialized 
     if(bitmap!=null){ 
      ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 
      boolean success = bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream); 
      if(success){ 
       oos.writeObject(byteStream.toByteArray()); 
      } 
     } 
    } 

    private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException{ 
     // Now, all again, deserializing - in the SAME ORDER! 
     // All non-transient fields 
     ois.defaultReadObject(); 
     // All other fields that you serialized 
     byte[] image = (byte[]) ois.readObject(); 
     if(image != null && image.length > 0){ 
      bitmap = BitmapFactory.decodeByteArray(image, 0, image.length); 
     } 
    } 

} 

あなたは、それらを格納するために、適切な(直列化可能)表現を見つける必要があります。たとえば、あなたがシリアライズ可能な形式に変換するためにMatrix.getValues()Matrix.setValues(...)方法を使用することができます。

希望すると、これが役立ちます。BasicsAdvanced

+0

ありがとう、これは私を助けてくれました! – neteinstein

関連する問題