1

シリアライゼーションを使用して保存して開くことができるようにしたいこのクラスがあります。

public class Region
implements Serializable
{
private final int      inputNumberOfColumnsAlongXAxis;
private final int      inputNumberOfColumnsAlongYAxis;
private double         inputDataScaleReductionOnXAxis;
private double         inputDataScaleReductionOnYAxis;

private int            numberOfColumnsAlongXAxis;
private int            numberOfColumnsAlongYAxis;
private int            cellsPerColumn;                // Z-Axis dimension
private float          inhibitionRadius;
private final float    percentMinimumOverlapScore;
private final float    minimumOverlapScore;

// ----------------------------------------------------------
/**
 * Save the current Region object on the view into a file named
 * "TrainedRegion".
 */
public static byte[] serializeObject(Object region)
{
    // TODO: save with current timestamp and use open pop-up
    // String timeStamp = "" + System.currentTimeMillis() / 1000;
    // String fileName = ("Region created at timestamp(seconds): " +
    // timeStamp);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    try {
      ObjectOutput objectOutput = new ObjectOutputStream(baos);
      objectOutput.writeObject(region);
      objectOutput.close();

      // Get the bytes of the serialized object
      byte[] bytesOfSerializedObject = baos.toByteArray();

      return bytesOfSerializedObject;
    } catch(IOException ioe) {
      Log.e("serializeObject", "error", ioe);

      return null;
    }
}


// ----------------------------------------------------------
/**
 * Returns a previously saved Region object with the given name.
 *
 * @param fileName
 * @return A previously saved Region object.
 */
public static Object deserializeObject(byte[] bytes)
{
    // TODO: later read Region object saved in file named by the time stamp during
    // saving.
    // ObjectInputStream inputStream = new ObjectInputStream(new
    // FileInputStream(fileName));

    try {
        ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bytes));
        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;
      }
}
}

以下は、上記のモデルとビュー (画面) のコントローラーとして機能する「画面」クラスです。

// ----------------------------------------------------------
/**
 * I want to be able to open a Region instance that was saved.
 */
public void openClicked() 
{
    // open the file created below in save method and write all the bytes into
    // the global region instance for this class. How can do this?

    this.region = (Region) this.region.deserializeObject(savedRegionInBytes);
}


// ----------------------------------------------------------
/**
 *
 */
public void saveClicked()
{
    this.savedRegionInBytes = this.region.serializeObject(this.region);

    // TODO: write savedRegionInBytes to a file. How can I do this?
}

また、Android でオブジェクトをファイルにシリアル化する簡単な方法があれば、ぜひ聞きたいです。ありがとう!

4

1 に答える 1

2

それは基本的にそれを行う方法です。しかし、あなたのようにバイトを処理する必要はありません。これらの 2 つのメソッドを使用して、Android アプリのプライベート ファイルに Serializable オブジェクトを読み書きします。

public static boolean saveRegion(Context context, Region region) {
    try {
        FileOutputStream fos = context.openFileOutput(REGION_FILENAME, Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(region);
        oos.close();
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

    return true;
}

public static Region getRegion(Context context) {
    try {
        FileInputStream fis = context.openFileInput(REGION_FILENAME);
        ObjectInputStream is = new ObjectInputStream(fis);
        Object readObject = is.readObject();
        is.close();

        if(readObject != null && readObject instanceof Region) {
            return (Region) readObject;
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    return null;
}
于 2012-11-15T08:05:46.827 に答える