How can I store an arraylist of custom objects?

后端 未结 3 1992
悲&欢浪女
悲&欢浪女 2020-12-28 18:49

I have created an arraylist that is made up of custom objects. Basically the user will create a class and every time a class is created, a new Lecture (my custom object) is

相关标签:
3条回答
  • 2020-12-28 19:09

    I use a class in a Weather app I'm developing...

    public class RegionList extends ArrayList<Region> {} // Region implements Serializeable
    

    To save I use code like this...

    FileOutputStream outStream = new FileOutputStream(Weather.WeatherDir + "/RegionList.dat");
    ObjectOutputStream objectOutStream = new ObjectOutputStream(outStream);
    objectOutStream.writeInt(uk_weather_regions.size()); // Save size first
    for(Region r:uk_weather_regions)
        objectOutStream.writeObject(r);
    objectOutStream.close();
    

    NOTE: Before I write the Region objects, I write an int to save the 'size' of the list.

    When I read back I do this...

    FileInputStream inStream = new FileInputStream(f);
    ObjectInputStream objectInStream = new ObjectInputStream(inStream);
    int count = objectInStream.readInt(); // Get the number of regions
    RegionList rl = new RegionList();
    for (int c=0; c < count; c++)
        rl.add((Region) objectInStream.readObject());
    objectInStream.close();
    
    0 讨论(0)
  • 2020-12-28 19:19

    You're in luck, all of your class' members are already serialzble so your first step is to say that Lecture is Serializable.

    public class Lecture implements Serializable {
    
        public String title;
        public String startTime;
        public String endTime;
        public String day;
        public boolean classEnabled;
    
        public Lecture(String title, String startTime, String endTime, String day, boolean enable){
            this.title = title;
            this.startTime = startTime;
            this.endTime = endTime;
            this.day = day;
            this.classEnabled = enable;
        }
    

    Next, you need to make a default constructor since serialization seems to require that. The last thing is you need to write your object out to a file. I usually use something like the following. Note this is for saving a game state so you might not want to use the cache directory.

    private void saveState() {
        final File cache_dir = this.getCacheDir(); 
        final File suspend_f = new File(cache_dir.getAbsoluteFile() + File.separator + SUSPEND_FILE);
    
        FileOutputStream   fos  = null;
        ObjectOutputStream oos  = null;
        boolean            keep = true;
    
        try {
            fos = new FileOutputStream(suspend_f);
            oos = new ObjectOutputStream(fos);
    
            oos.writeObject(this.gameState);
        }
        catch (Exception e) {
            keep = false;
            Log.e("MyAppName", "failed to suspend", e);
        }
        finally {
            try {
                if (oos != null)   oos.close();
                if (fos != null)   fos.close();
                if (keep == false) suspend_f.delete();
            }
            catch (Exception e) { /* do nothing */ }
        }
    }
    

    Reading the data back is pretty symmetric to the write so I have left that out for this answer. Also, there are still a lot of caveats to Serialized objects so I suggest you do some Google searches and read up on Java serialization in general.

    0 讨论(0)
  • 2020-12-28 19:25

    You can use:

    System.Runtime.Serialization
    

    You can see an example here: Serialization in C#

    0 讨论(0)
提交回复
热议问题