8

親愛なる同僚の皆さん、こんにちは。

複数の Plant クラス オブジェクトをシリアル化および逆シリアル化する Garden クラスがあります。シリアライズは機能していますが、メイン静的メソッドの呼び出し変数に割り当てたい場合、デシリアライズは機能していません。

public void searilizePlant(ArrayList<Plant> _plants) {
    try {
        FileOutputStream fileOut = new FileOutputStream(fileName);
        ObjectOutputStream out = new ObjectOutputStream(fileOut);
        for (int i = 0; i < _plants.size(); i++) {
            out.writeObject(_plants.get(i));
        }
        out.close();
        fileOut.close();
    } catch (IOException ex) {
    }
}

コードのデシリアライズ:

public ArrayList<Plant> desearilizePlant() {
    ArrayList<Plant> plants = new ArrayList<Plant>();
    Plant _plant = null;
    try {
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName));
        Object object = in.readObject();

       // _plant = (Plant) object;


        // TODO: ITERATE OVER THE WHOLE STREAM
        while (object != null) {
            plants.add((Plant) object);
            object = in.readObject();
        }

        in.close();
    } catch (IOException i) {
        return null;
    } catch (ClassNotFoundException c) {
        System.out.println("Employee class not found");
        return null;
    }
    return plants;
}

私の呼び出しコード:

ArrayList<Plant> plants = new ArrayList<Plant>();
plants.add(plant1);
Garden garden = new Garden();
garden.searilizePlant(plants);

// THIS IS THE PROBLEM HERE
ArrayList<Plant> dp = new ArrayList<Plant>();
dp = garden.desearilizePlant();

編集
null ポインター例外が発生しました
@NilsH のソリューションは正常に機能しています、ありがとう!

4

3 に答える 3

19

代わりにリスト全体をシリアル化するのはどうですか? リスト内の個々のオブジェクトをシリアル化する必要はありません。

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

それでも問題が解決しない場合は、エラーの詳細を投稿してください。

于 2013-04-22T11:13:36.957 に答える
0

配列線形リストにシリアル化すると、逆シリアル化するときに配列線形リストにキャストして戻すことができます-他のすべての方法は私にとって失敗しました:

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()
        }
    }
}
于 2015-05-14T18:20:26.900 に答える