Ik begreep, denk ik, dat een "Bean" een Java klasse is met eigenschappen en getters/setters. Voor zover ik het begrijp, is het het equivalent van een C struct. Is dat waar?
En, is er een echt syntactisch verschil tussen een bean en een gewone klasse? Is er een speciale definitie of een interface?
Kortom, waarom is hier een term voor?
En wat betekent de Serializable
interface?
Een JavaBean is gewoon een standaard
Serializable
.Dat's het. Het is gewoon een conventie. Veel bibliotheken zijn er echter van afhankelijk.
Met betrekking tot Serializable
, uit de API documentatie:
Serialiseerbaarheid van een klasse wordt mogelijk gemaakt door de klasse die de java.io.Serializable interface. Klassen die deze interface zullen geen van hun state laten serializeren of deserializeren. Alle subtypes van een serializable class zijn zelf serializable. De serialization interface heeft geen methodes of velden en dient enkel om de semantiek van serialiseerbaar te identificeren.
Met andere woorden, serialiseerbare objecten kunnen naar streams geschreven worden, en dus naar bestanden, object-databanken, alles eigenlijk.
Ook is er geen syntactisch verschil tussen een JavaBean en een andere klasse -- een klasse is een JavaBean als zij de normen volgt.
Er is een term voor omdat de standaard bibliotheken in staat stelt programmatisch dingen te doen met klasse-instanties die je op een voorgedefinieerde manier definieert. Als een bibliotheek bijvoorbeeld een object wil streamen dat je aan haar doorgeeft, dan weet ze dat ze dat kan omdat je object serializable is (in de veronderstelling dat de bibliotheek vereist dat je objecten echte JavaBeans zijn).
Er is een term voor om het speciaal te laten klinken. De werkelijkheid is lang niet zo mysterieus.
In principe, een "Bean":
java.io.Serializable
, en doet dat correct), datgetFoo()
is de getter voor de "Foo" property), enBijwerken:
Wat Serializable
betreft: Dat is niets anders dan een "marker interface" (een interface die'geen functies declareert) die Java vertelt dat de implementerende klasse instemt met (en impliceert dat het in staat is tot) "serialization" -- een proces dat een instantie omzet in een stroom van bytes. Deze bytes kunnen in bestanden worden opgeslagen, over een netwerkverbinding worden verzonden, enz., en bevatten voldoende informatie om een JVM (tenminste, een die het type van het object kent) in staat te stellen het object later te reconstrueren -- mogelijk in een andere instantie van de toepassing, of zelfs op een heel andere machine!
Natuurlijk moet de klasse, om dat te kunnen doen, zich aan bepaalde beperkingen houden. De belangrijkste daarvan is dat alle instantievelden ofwel primitieve types moeten zijn (int, bool, enz.), instanties van een of andere klasse die ook serializable is, of gemarkeerd als transient
zodat Java niet zal proberen ze op te nemen. (Dit betekent natuurlijk dat transient
velden de reis over een stream niet zullen overleven. Een klasse die transient
velden heeft moet voorbereid zijn om ze te herinitialiseren indien nodig).
Een klasse die zich niet aan deze beperkingen kan houden, moet Serializable
niet implementeren (en, IIRC, de Java compiler zal dit zelfs niet laten doen).
Wat betreft het tweede deel van je vraag: Serialisatie is een persistentiemechanisme dat wordt gebruikt om objecten op te slaan als een opeenvolging van ondertekende bytes. Minder formeel gezegd, het slaat de toestand van een object op, zodat je het later kunt terughalen, door de-serialisatie.