2013-05-31 8 views
8

Zacząłem czytać o serializacji w Javie i trochę w innych językach, ale co jeśli mam ogólną klasę i chcę zapisać instancję do pliku.Jak serializować klasę generyczną w Javie?

przykład kodu

public class Generic<T> { 
    private T key; 
    public Generic<T>() { 
    key = null; 
    } 
    public Generic<T>(T key) { 
    this.key = key; 
    } 
} 

Co najlepszym sposobem, aby uratować tego typu obiektu? (Oczywiście jest więcej w mojej prawdziwej klasie, ale po prostu zastanawiam się nad samym pomysłem.)

+3

Tak jak każdej innej klasy: uczynić go zaimplementować interfejs '' Serializable':) ' – sp00m

+0

@ sp00m: czasami nie jest możliwe, aby zmienić klasę. Prawdopodobnie nie w tym przypadku;) – Burkhard

Odpowiedz

17

Musisz potrzebujesz, aby jak zwykle stworzyć klasę ogólną Serializable.

public class Generic<T> implements Serializable {...}

Jeżeli pola są zadeklarowane używając typy generyczne, ty chcieć aby określić, że powinny one realizować Serializable.

public class Generic<T extends Serializable> implements Serializable {...}

Należy zdawać sobie sprawę z niezwykłej składni Javy tutaj.

public class Generic<T extends Something & Serializable> implements Serializable {...}

+0

Ty wolę tę odpowiedź, ponieważ łatwiej jest mi dodać tę rzecz do mojej klasy ... Mam to już ... implementuje serializowalne, ale kiedy próbuję ObjectOutputStream, aby zapisać. Mój program po prostu zawiesza się. – Leolian

+0

Implementacja 'Serializable' łamie enkapsulację i ukrywanie informacji; wszyscy członkowie prywatni i pakietowi prywatni stają się częścią wyeksportowanego interfejsu API klasy. Wprowadza to potencjalne luki w zabezpieczeniach i może sprawić, że klasa będzie bardziej delikatna. Decyzja o wdrożeniu Serializable powinna być podejmowana z wielką starannością, a zserializowana forma powinna być starannie zaprojektowana (Effefective Java, 2nd Ed). – scottb

0

Jeśli nie chcą (lub nie mogą) wdrożyć Serializable interfejs, można użyć XStream. Oto krótki tutorial.

W twoim przypadku:

XStream xstream = new XStream(); 
Generic<T> generic = ...;//whatever needed 
String xml = xstream.toXML(generic); 
//write it to a file (or use xstream directly to write it to a file) 
+0

Inną alternatywą do implementacji 'Serializable' jest implementacja' Externalizable' (która sama rozszerza 'Serializable'). – scottb

Powiązane problemy