Чтение моего сериализованного объекта из файла в Android - PullRequest
1 голос
/ 31 мая 2011

Это моя первая попытка сериализации / десериализации объектов на любой платформе, и, мягко говоря, я в замешательстве.

После реализации 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 - Десериализация файла на платформе Android и попытался изменить его для моегоприложение.При запуске я получаю

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

Когда вывод должен быть загружен и сохраненная игра запускается с момента сохранения.Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 31 мая 2011

Ошибка, которую вы показали, совсем не связана с сериализацией: на самом деле это ошибка отображения видео. Я бы посоветовал посмотреть на объект ДО ТОГО, как вы сериализуете, чтобы убедиться, что он не нулевой, и я бы также предложил сериализацию в файл на SD-карте, чтобы убедиться, что вы действительно выводили данные (поэтому используйте new FileOutputStream("/mnt/sdcard/serializationtest") в качестве потока вывода и new FileInputStream("/mnt/sdcard/serializationtest") в качестве входного потока) во время отладки; после того, как он заработает, вы можете вернуться к методам контекста, но убедитесь, что ваша sdcard подключена, пока вы это делаете.

Наконец, измените свою регистрацию, чтобы она выглядела так:

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

и посмотрите, какая ошибка возвращается. Я ожидаю, что сериализация как-то не получается.

0 голосов
/ 04 марта 2016

Я создал класс ниже, чтобы сохранить и получить объект.

открытый класс 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);
}

}

0 голосов
/ 31 мая 2011

Для выделения или десериализации чего-либо вы можете использовать SIMPLE api. Он очень прост в использовании. Скачайте файл и используйте его в своей программе

Взгляните сюда

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

Спасибо, Дипак

...