在Android中从文件中读取我的序列化对象

时间:2011-05-31 14:33:27

标签: android serialization file-io

这是我第一次尝试在任何平台上序列化/反序列化对象,说得客气一点,我很困惑。

将Serializable实现到我的游戏对象后,我将其输出到文件中:

public void saveGameState(){


    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    try { 


        ObjectOutput out = new ObjectOutputStream(bos); 
          out.writeObject(theGame);//theGame is an instance of the custom class                  
                                          //TGame which stores game info.

          byte[] buf = bos.toByteArray(); 

          FileOutputStream fos = this.openFileOutput(filename,                      
                   Context.MODE_PRIVATE);
          fos.write(buf);
          fos.close(); 
        } catch(IOException ioe) { 
          Log.e("serializeObject", "error", ioe); 


        } 
        File f =this.getDir(filename, 0);
        Log.v("FILE",f.getName());    
}

这似乎有效,因为我没有提出异常。我只能确定何时将其反序列化。这就是梨形的地方。

public God loadSavedGame(){
    TGame g=null;
    InputStream instream = null;
    try {
        instream = openFileInput(filename);
    } catch (FileNotFoundException e) {

        e.printStackTrace();
        return null;
    }
     try {
        ObjectInputStream ois = new ObjectInputStream(instream);

         try {
            g= (TGame) ois.readObject();
            return g;
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
     } catch (StreamCorruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    }
          }

我从这里Android Java -- Deserializing a file on the Android platform获得了此代码的基础,并尝试为我的应用修改它。跑步时我得到了

 05-31 23:30:45.493: ERROR/copybit(1279): copyBits failed (Invalid argument)

应该加载输出并保存游戏从保存时开始。 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

要序列化或反序列化任何内容,您可以使用SIMPLE api。这是非常容易使用。下载文件并在程序中使用

看看这里

http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#deserialize

谢谢Deepak

答案 1 :(得分:0)

您显示的错误与序列化完全无关:它实际上是视频显示错误。我建议在序列化之前查看对象以确保它不为空,我还建议序列化到SD卡上的文件以确保实际上有数据输出(因此使用new FileOutputStream("/mnt/sdcard/serializationtest")作为在调试时,输出流和new FileInputStream("/mnt/sdcard/serializationtest")作为输入流);您可以在工作后切换回上下文方法,但确保在执行此操作时插入了SD卡。

最后,修改您的日志记录,如下所示:

try {
        ObjectInputStream ois = new ObjectInputStream(instream);

         try {
            g= (TGame) ois.readObject();
            return g;
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            android.util.Log.e("DESERIALIZATION FAILED (CLASS NOT FOUND):"+e.getMessage(), e);
            e.printStackTrace();
            return null;
        }
     } catch (StreamCorruptedException e) {
            android.util.Log.e("DESERIALIZATION FAILED (CORRUPT):"+e.getMessage(), e);
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    } catch (IOException e) {
            android.util.Log.e("DESERIALIZATION FAILED (IO EXCEPTION):"+e.getMessage(), e);
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    }

并查看返回的错误。我希望序列化以某种方式失败。

答案 2 :(得分:0)

我创建了下面的类来执行保存和检索对象。

公共类SerializeUtil {

public static <T extends Serializable>   void saveObjectToFile(Context context, T object, String fileName){

    try {

        FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
        ObjectOutputStream os = new ObjectOutputStream(fos);
        os.writeObject(object);
        os.close();
        fos.close();

    } catch (IOException e) {
        e.printStackTrace();
    }
}


public static<T extends Serializable> T getObjectFromFile(Context context, String fileName){

    T object = null;

    try {

        FileInputStream fis = context.openFileInput(fileName);
        ObjectInputStream is = new ObjectInputStream(fis);
        object = (T) is.readObject();
        is.close();
        fis.close();

    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    return object;
}

public static void removeSerializable(Context context, String filename) {
    context.deleteFile(filename);
}

}