Ar klasėse, kurios įgyvendina Serializable, turi būti beargumentų konstruktoriai?

0
8214

Ne. Tai dažnas klaidingas supratimas. Deserializavimo procese nenaudojamas objekto konstruktorius – objektas sukuriamas be konstruktoriaus ir inicijuojamas naudojant nuosekliuosius egzemplioriaus duomenis. Vienintelis reikalavimas konstruktoriui klasėje, kuri įgyvendina Serijinis yra ta, kad pirmoji neserializuojama superklasė savo paveldėjimo hierarchijoje turi turėti beargumentinį konstruktorių. (Išsamesnį paaiškinimą rasite adresu http://www.jguru.com/jguru/faq/view.jsp?EID=34802). Tai prasminga: deserializuojant reikia atkurti visą objekto būseną, kuri apima bet kokių superklasių būseną. Jei pati superklasė nėra serializuojama, deserializacija turi sukurti tą superklasę nuo nulio – taigi ir reikalavimas. Pavyzdžiui, su šia klase:

public class MySerializableClass įgyvendina Serializable { ... }

tu darai ne reikia beargumentinio konstruktoriaus. MySerializableClass atitinka visus reikalavimus, nes pirmoji neserijuojama superklasė, Objektas, turi beargumentinį konstruktorių. Šiame pavyzdyje:

public class MyFirstClass { } public class MySecondClass išplečia MyFirstClass įgyvendina Serializable { ... }

„MyFirstClass“. turi numatytąjį beargumentinį konstruktorių, todėl kito konstruktoriaus nereikia. Jei vis dėlto „MyFirstClass“. apibrėžtus konstruktorius, kurie priėmė argumentus, taip pat aiškiai nepaskelbdami konstruktoriaus be argumentų, tada gausite NeserializuojamaIšskyrus kai bandoma serializuoti Mano Antroji klasė.

Visi reikalavimai objektui, kuris įgyvendina Serijinis yra išvardyti adresu http://www.jguru.com/jguru/faq/view.jsp?EID=31434.