Wie serialisiere ich eine Liste in Java?

81

Ich möchte eine Liste tief klonen. dafür haben wir eine Methode

// apache commons method. This object should be serializable
SerializationUtils.clone ( object ) 

Um meine Liste zu klonen, sollte ich sie zuerst in serialisierbar konvertieren. Ist es möglich, eine Liste in eine serialisierbare Liste umzuwandeln?

Rakesh Juyal
quelle

Antworten:

162

Alle Standardimplementierungen sind java.util.Listbereits implementiert java.io.Serializable.

Obwohl es java.util.Listsich nicht um einen Subtyp von handelt java.io.Serializable, sollte es sicher sein, die Liste in zu konvertieren Serializable, solange Sie wissen, dass es sich um eine der Standardimplementierungen wie ArrayListoder handelt LinkedList.

Wenn Sie sich nicht sicher sind, kopieren Sie zuerst die Liste (mit etwas wie new ArrayList(myList)), dann wissen Sie, dass sie serialisierbar ist.

Skaffman
quelle
1
Warum sollte jemand jemals etwas in Serializable umwandeln wollen? Serializable ist nur eine Marker-Schnittstelle. etwas auf Serializable zu übertragen ist nicht sinnvoll.
Jesper
19
Da SerializationUtils.clone()ein Argument für den Typ erforderlich Serializableist und Ihre Variable vom Typ ist List, müssen Sie sie umwandeln.
Skaffman
2
@Jesper: Es ist eine Markierungsschnittstelle, die besagt, dass es sicher ist, die Klasse zu serialisieren. Android verwendet die serialisierbare Oberfläche für viele Zwecke. Weitergabe von Vorsatz-Extras, gemeinsamen Vorlieben usw.
Zack Marrapese
11
Ja, ich habe diese Frage bei der Suche nach Android-Lösungen gefunden. Mein Zusatz ist, List<MyClass> myObjs = new ArrayList<MyClass>();trifft das nicht , tut es Serializableaber ArrayList<MyClass> myObjs = new ArrayList<MyClass>();.
Evi Song
2
@Adam Es ist möglicherweise am besten, die Sicherheit beim Kompilieren zu gewährleisten, indem Sie stattdessen die Signatur verwenden. Dazu <T extends List<Foo> & Serializable> setFooList(T list)muss Ihr Anrufer Ihnen eine Instanz einer List-Implementierung übergeben, die auch serialisierbar ist.
Theodore Murdock
32

Wie bereits erwähnt, sind die meisten Standardimplementierungen von Listserialisierbar. Sie müssen jedoch sicherstellen, dass die Objekte, auf die in der Liste verwiesen wird, auch serialisierbar sind.

Brian Agnew
quelle
1
Wie bereits erwähnt, Listhandelt es sich um eine Schnittstelle, die nicht erweitert wird, Serializableoder um eine Schnittstelle, die dies tut. Lists, die nicht serialisierbar sind, sind in Standardbibliotheken möglicherweise nicht üblich, aber der erste Satz wird dadurch nicht richtig.
Arne.b
13

Liste ist nur eine Schnittstelle. Die Frage ist: Ist Ihre tatsächliche List- Implementierung serialisierbar? In Bezug auf die Standard- List- Implementierungen ( ArrayList , LinkedList ) aus der Java-Laufzeit sind die meisten bereits vorhanden.

Dolch
quelle