Logan Gallois
Logan Gallois

Reputation: 622

read serializable custom object into file android

i am trying to record and reab back my list into file. It's working great until I restart my application. I am working with simulator (I don't have a real phone under Android)

Here is my function to record my class into a file :

public boolean writeRecordsToFile(String path, DummyContent object){
    FileOutputStream fos;
    ObjectOutputStream oos = null;
    try {
        fos = fileContext.openFileOutput(path, Context.MODE_PRIVATE);
        oos = new ObjectOutputStream(fos);
        oos.writeObject(object);
        oos.close();
        Log.d("fileManager", "Records write successfully");
        return true;
    } catch (Exception e) {
        Log.e("fileManager", "Cant save records : " + e.getMessage());
        return false;
    }
    finally {
        if (oos != null)
            try {
                oos.close();
            } catch (Exception e) {
                Log.e("fileManager", "Error while closing stream "+e.getMessage());
            }
    }
}

Here is my reading Function :

public boolean readRecordsFromFile(String path){
    FileInputStream fin;
    ObjectInputStream ois=null;
    try {
        fin = fileContext.openFileInput(path);
        ois = new ObjectInputStream(fin);
        DummyContent records = (DummyContent) ois.readObject();
        records.addItem("test", "test", "test");
        ois.close();
        Log.d("fileManager", "Records read successfully :\n" + records.toString());
        Log.d("fileManager", "nbArticle found : " + String.valueOf(records.ITEMS.size()));
        Log.d("fileManager", "article 0 title :\n" + records.ITEMS.get(0).content);
        Log.d("fileManager", "article 10 title :\n" + records.ITEMS.get(10).content);
        return true;
    } catch (Exception e) {
        Log.e("fileManager", "Cant read saved records : "+e.getMessage());
        return false;
    }
    finally {
        if (ois != null)
            try {
                ois.close();
            } catch (Exception e) {
                Log.e("fileManager", "Error in closing stream while reading records : "+e.getMessage());
            }
    }
}

and here is my class :

public class DummyContent implements Serializable {

/**
 * An array of sample (dummy) items.
 */
public static List<DummyItem> ITEMS = new ArrayList<DummyItem>();

/**
 * A map of sample (dummy) items, by ID.
 */
public static Map<String, DummyItem> ITEM_MAP = new HashMap<String, DummyItem>();

public void addItem(String first, String second, String third) {
    DummyItem dummyItem = new DummyItem(first, second, third, android.R.drawable.ic_input_add);
    ITEMS.add(dummyItem);
    ITEM_MAP.put(dummyItem.id, dummyItem);
}

public void deleteAll() {
    ITEMS = new ArrayList<DummyItem>();
    ITEM_MAP = new HashMap<String, DummyItem>();
}

public void changeURL(Long index, String newURL) {
    ITEMS.get(index.intValue()).url = newURL;
}

public void changeContent(Long index, String newContent) {
    ITEMS.get(index.intValue()).contenu = newContent;
}

/**
 * A dummy item representing a piece of content.
 */
public static class DummyItem {
    public final String id;
    public final String content;
    public final String details;
    public final int imageResource;
    public String url;
    public String contenu;

    public DummyItem(String id, String content, String details, int imageResource) {
        this.id = id;
        this.content = content;
        this.details = details;
        this.imageResource = imageResource;
        this.url = "";
        this.contenu = "";
    }

    @Override
    public String toString() {
        return content;
    }
}

}

Finally I read my file at the onCreate of my MainActivity (first activity at the lunching app) :

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    fileManager = new FileManager(this.getApplicationContext());
    Log.d("Main", String.valueOf(fileManager.fileExist("Article.art")));
    fileManager.readRecordsFromFile("Article.art"); /* Bug here : size of my array is empty but file's size is the same */
}

Here is my console return :

D/fileManager: size = 102

D/fileManager: Records read successfully : D/fileManager: nbArticle found : 1 (because i add an item at the read function) E/fileManager: Cant read saved records : Index: 10, Size: 1

I know it is working because when I write and read directly after the writting, I got all my items and I can read several times and I still got all items (this bug semms to be only present when I restart my application)

Maybe can I got help ?

Thanks !

Upvotes: 0

Views: 381

Answers (1)

Little Santi
Little Santi

Reputation: 8823

The reason is very easy: You have declared some field as static, which are not covered by standard serialization: So, the contents of these fields were never written nor read from the file. That's why they "dissapeared" after a JVM restart.

Any field you want to be serialized/deserialized, you must declare it as instance member (not static).

See documentation on Serializable.

Upvotes: 2

Related Questions