Deserialize multiple Java Objects

前端 未结 3 425
感动是毒
感动是毒 2020-12-10 15:59

hello dear colleagues,

I have a Garden class in which I serialize and deserialize multiple Plant class objects. The serializing is working but the deserializing is n

相关标签:
3条回答
  • 2020-12-10 16:05

    How about serializing the entire list instead? There's no need to serialize each individual object in a list.

    public void searilizePlant(ArrayList<Plant> _plants) {
        try {
            FileOutputStream fileOut = new FileOutputStream(fileName);
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(_plants);
            out.close();
            fileOut.close();
        } catch (IOException ex) {
        }
    }
    
    public List<Plant> deserializePlant() {
        List<Plants> plants = null;
        try {
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
            plants = in.readObject(); 
            in.close();
        }
        catch(Exception e) {}
        return plants;
    }
    

    If that does not solve your problem, please post more details about your error.

    0 讨论(0)
  • 2020-12-10 16:14

    It may not always be feasible to deserialize a whole list of objects (e.g., due to memory issues). In that case try:

        ObjectInputStream in = new ObjectInputStream(new FileInputStream(
                filename));
    
        while (true) {
            try {
                MyObject o = (MyObject) in.readObject();
                // Do something with the object
            } catch (EOFException e) {
                break;
            }
        }
    
        in.close();
    

    Or using the Java SE 7 try-with-resources statement:

        try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(
                filename))) {
            while (true) {
                MyObject o = (MyObject) in.readObject();
                // Do something with the object
            }
        } catch (EOFException e) {
            return;
        }
    
    0 讨论(0)
  • 2020-12-10 16:25

    If you serialize it to an array linear list, you can cast it back to an array linear list when deserializing it -- all other methods failed for me:

    import java.io.*;
    import java.util.ArrayList;
    import java.util.Arrays;
    
    public class Program 
    {
        public static void writeToFile(String fileName, Object obj, Boolean appendToFile) throws Exception
        {
            FileOutputStream fs = null;
            ObjectOutputStream os = null;
            try
            {
                fs = new FileOutputStream(fileName);
                os = new ObjectOutputStream(fs);
    
                //ObjectOutputStream.writeObject(object) inherently writes binary
                os.writeObject(obj); //this does not use .toString() & if you did, the read in would fail
            }
            catch (FileNotFoundException e)
            {
                e.printStackTrace();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                try
                {
                    os.close();
                    fs.close();
                }
                catch(Exception e)
                {
                    //if this fails, it's probably open, so just do nothing
                }
            }
        }
    
    
        @SuppressWarnings("unchecked")
        public static ArrayList<Person> readFromFile(String fileName)
        {
            FileInputStream fi = null;
            ObjectInputStream os = null;
            ArrayList<Person> peopleList = null;
            try
            {
                fi = new FileInputStream(fileName);
                os = new ObjectInputStream(fi);
                peopleList = ((ArrayList<Person>)os.readObject());  
            }
            catch (FileNotFoundException e)
            {
                e.printStackTrace();
            }
            catch(EOFException e)
            {                     
                e.printStackTrace();
            }
            catch(ClassNotFoundException e) 
            {
                e.printStackTrace();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                try
                {
                    os.close();
                    fi.close();
                }
                catch(Exception e)
                {
                    //if this fails, it's probably open, so just do nothing
                }
            }
            return peopleList;
        }
    
    
    
    
        public static void main(String[] args) 
        {
            Person[] people = { new Person(1, 39, "Coleson"), new Person(2, 37, "May") };
            ArrayList<Person> peopleList = new ArrayList<Person>(Arrays.asList(people));
    
            System.out.println("Trying to write serializable object array: ");
    
            for(Person p : people)
            {
                System.out.println(p);
            }
            System.out.println(" to binary file");
    
            try
            {
                //writeToFile("output.bin", people, false); //serializes to file either way
                writeToFile("output.bin", peopleList, false); //but only successfully read back in using single cast
            }                                                // peopleList = (ArrayList<Person>)os.readObject();
                                                             // Person[] people = (Person[])os.readObject(); did not work
                                                            // trying to read one at a time did not work either (not even the 1st object) 
            catch (Exception e)
            {
                e.printStackTrace();
            }
    
    
    
            System.out.println("\r\n");
    
    
    
    
            System.out.println("Trying to read object from file. ");
            ArrayList<Person> foundPeople = null;
            try
            {
                foundPeople = readFromFile("input.bin");
            } 
            catch (Exception e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            if (foundPeople == null)
            {
                System.out.println("got null, hummm...");
            }
            else
            {
                System.out.println("found: ");
    
                for(int i = 0; i < foundPeople.size(); i++)
                {
                    System.out.println(foundPeople.get(i));
                }
    
                //System.out.println(foundPeople); //implicitly calls .toString()
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题