2015-04-18, 12:59
  #1
Medlem
Hej,

Har problem med att spara en LinkedList till fil. Har lyckats spara och ladda objektet som sparas i den länkade filen, men när jag istället försöker spara ner hela LinkedList lyckas jag inte läsa ut den korrekt. Efter utläsningen fungerar inte listan som en lista längre. Metoderna fungerar liksom inte. Antagligen är den inte en LinkedList efter utläsningen. Något måste gå fel!

Kod:
public void saveData()
    {

        if(LinkedList_taskItems.isEmpty()) {
            File f = new File(this.getFilesDir()+"/datafil1.dat");
            f.delete();
            return;
        }
        try {
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(this.openFileOutput("datafil1.dat", MODE_PRIVATE));


            objectOutputStream.writeObject(LinkedList_taskItems);

            objectOutputStream.close();

        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Kod:
public void loadData()
    {
        File f = new File(this.getFilesDir()+"/datafil1.dat");

        if(!f.exists())
            return;
        try {
            ObjectInputStream objectinputstream = new ObjectInputStream(this.openFileInput("datafil1.dat"));

            LinkedList_taskItems = ((LinkedList<TaskItem>) objectinputstream.readObject());
            objectinputstream.close();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (OptionalDataException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (StreamCorruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally{
            return;
        }
    }
Citera
2015-04-18, 14:31
  #2
Medlem
bithaxs avatar
Vad gör din "this.openFileOutput()" metod?

Gissar på att någonting går fel för att du inte skriver över filen emellan körningarna.
Sedan läser du ut det första objektet som är gammalt och tomt.

Pröva att ta bort filen och se vad som händer.
__________________
Senast redigerad av bithax 2015-04-18 kl. 14:44.
Citera
2015-04-19, 18:42
  #3
Medlem
Hej,

Det är en metod som hör till Context.

Det har inte med att filen redan existerar att göra. Tagit bort och testat. Det verkar som om att listan inte spras ner som den ska, eller läses in som den ska.
Citera
2015-04-19, 20:39
  #4
Medlem
Jag ser inget direkt fel på koden. Gjorde ett testcase som fungerar med följande kod (java 7).

Kod:
public class LinkedListSerializationTest {
	
	@Rule
	public TemporaryFolder folder = new TemporaryFolder();
	
	@SuppressWarnings("unchecked")
	@Test
	public void bla() throws FileNotFoundException, IOException, ClassNotFoundException {
		
		LinkedList<SomeStruct> list = new LinkedList<SomeStruct>();
		list.add(new SomeStruct(1, "1"));
		list.add(new SomeStruct(2, "2"));
		
		File destination = folder.newFile();
		try(ObjectOutputStream oos = 
				new ObjectOutputStream(new FileOutputStream(destination))) {
			oos.writeObject(list);
		}
		
		Object readObject;
		try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream(destination))) {
			readObject = ois.readObject();
		}
		
		Assert.assertTrue(LinkedList.class.isAssignableFrom(readObject.getClass()));
		
		LinkedList<SomeStruct> deserializedList = (LinkedList<SomeStruct>) readObject;
		
		Assert.assertEquals(2, deserializedList.size());
		Assert.assertEquals(1, deserializedList.get(0).getAnInt());
		Assert.assertEquals(2, deserializedList.get(1).getAnInt());
		
	}

}

SomeStruct klassen:

Kod:
public class SomeStruct implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private int anInt;
	
	private String aString;
	
	public SomeStruct(int anInt, String aString){
		this.anInt = anInt;
		this.aString = aString;
	}

	public int getAnInt() {
		return anInt;
	}

	public String getaString() {
		return aString;
	}
	
}

Jämför och se om du har missat något. Du behöver junit 4 på classpathen för att köra testet.
Citera
2015-05-04, 00:49
  #5
Medlem
Der_Richters avatar
Är TaskItem som du har i din collection Serializeable?
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in