# LinkedList speichern



## ZAntjeZ (10. Januar 2005)

Hallo,

ich moechte eine LinkedList so speichern, dass ich sie wieder einlesen kann und auch die Struktur (also die Liste mit ihren Elementen) wieder bekomme. Wie kann ich dass machen?

Danke fuer jeden Tip!


----------



## RedWing (10. Januar 2005)

Hallo,
das Stichwort ist Serial bzw Deserialisierung:

Schau mal hier:


```
import java.util.LinkedList;
import java.io.IOException; 
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;

class LinkListSerializer{

        public static void serializeListToFile(LinkedList<Integer> list, String file){

                try{
                        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(file));
                        os.writeObject(list);
                        os.close();
                }
                catch(IOException e){ 
                        System.out.println("IOException occured :(");
                        e.printStackTrace();
                }
        }

        public static LinkedList<Integer> deserializeListFromFile(String file){
                
                LinkedList<Integer> ret = null;
                try{ 
                        ObjectInputStream is = new ObjectInputStream(new FileInputStream(file));
                        ret = (LinkedList<Integer>)(is.readObject());
                        is.close();
                }
                catch(Exception e){
                        System.out.println("IOException occured :(");
                        e.printStackTrace();    
                }
                return ret;
                
        }
                
        public static void main(String[] args){ 

                String file = "linkedlist.obj";
                LinkedList<Integer> out_list = new LinkedList<Integer>();
                out_list.add(3);
                out_list.add(5);
                out_list.add(1);
                serializeListToFile(out_list, file);
                LinkedList<Integer> in_list = deserializeListFromFile(file);
                
                while(!in_list.isEmpty()){

                        System.out.print(in_list.poll() + "-> ");
                }
                System.out.println("null");
                
        }
}
```

Wenn du ein eignes Objekt erstellen möchtest was du de- bzw serialisieren möchtest muss es
das Interface Serializable implementieren...

Gruß

RedWing


----------



## Thomas Darimont (10. Januar 2005)

Hallo!

Du könntest auch den XMLEncoder/XMLDecoder versuchen:


```
/*
 * Created on 10.01.2005@12:18:22
 *
 * TODO Explain me...
 */
package de.tutorials;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.LinkedList;
import java.util.List;

/**
 * @author Darimont
 *
 * TODO Comment me
 */
public class XMLSerializerTest {

    public static void main(String[] args) {
        new XMLSerializerTest().doIt();
    }

    /**
     * 
     */
    private void doIt() {
        List list = new LinkedList();
        list.add("AAA");
        list.add("BBB");
        list.add(new Foo());

        try {
            File file = new File("c:/myLinkedList.xml");
            XMLEncoder encoder = new XMLEncoder(new FileOutputStream(file));
            encoder.writeObject(list);
            encoder.flush();
            encoder.close();

            XMLDecoder decoder = new XMLDecoder(new FileInputStream(file));
            List lst = (List) decoder.readObject();
            System.out.println(lst);

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

Foo:

```
/*
 * Created on 10.01.2005@12:24:28
 *
 * TODO Explain me...
 */
package de.tutorials;

public class Foo {
    int a = 10;

    int b = 5;

    public Foo() {

    }

    public String toString() {
        // TODO Auto-generated method stub
        return a + ":" + 5;
    }
}
```

myLinkedList.xml

```
<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.5.0" class="java.beans.XMLDecoder"> 
 <object class="java.util.LinkedList"> 
  <void method="add"> 
   <string>AAA</string> 
  </void> 
  <void method="add"> 
   <string>BBB</string> 
  </void> 
  <void method="add"> 
   <object class="de.tutorials.Foo"/> 
  </void> 
 </object> 
</java>
```

Gruß Tom


----------



## ZAntjeZ (10. Januar 2005)

Ist vielleicht ne bloede Frage: aber was haben die eckigen Klammern LinkedList< Integer > zu sagen?


----------



## RedWing (10. Januar 2005)

ZAntjeZ hat gesagt.:
			
		

> Ist vielleicht ne bloede Frage: aber was haben die eckigen Klammern LinkedList< Integer > zu sagen?



Die spitzen Klammern drücken aus das es sich um einen generischen Datentyp handelt...
Seit java 1.5 eingeführt...

Siehe http://java.sun.com/developer/technicalArticles/J2SE/generics/

Damit bleibt dir nun endlich dieses (sorry) dumme gecaste auf den entsprechenden Typ, beim
Elementauslesen einer speziellen Collection erspart....
Wenn du eine J2SE <= 1.5 verwendest müsstest du das Beispiel halt auf die alte
Vorgehensweise anpassen.

Gruß

RedWing


----------

