Мисля, че разбрах, че "Bean" е Java клас със свойства и getters/setters. Доколкото разбирам, той е еквивалент на C struct. Вярно ли е това?
Също така, има ли реална синтактична разлика между боб и обикновен клас? Има ли някаква специална дефиниция или интерфейс?
Изобщо, защо има термин за това?
Също така какво означава интерфейсът Serializable
?
JavaBean е просто стандартна
Serializable
.Това е всичко. Това е просто конвенция. Много библиотеки обаче зависят от нея.
Що се отнася до Serializable
, от API документация:
Сериализируемостта на даден клас се активира от класа, който имплементира
интерфейса java.io.Serializable. Класовете, които не имплементират този интерфейс, няма да могат да сериализират или десериализират нито едно от своите състояния. Всички подтипове на сериализируем клас сами по себе си са сериализируеми. сериализиращият интерфейс няма методи или полета и служи само за определяне на семантиката на това да бъдеш сериализируем.
С други думи, сериализируемите обекти могат да се записват в потоци, а оттам и във файлове, бази данни с обекти, изобщо във всичко.
Освен това няма синтактична разлика между JavaBean и друг клас - един клас е JavaBean, ако следва стандартите.
Има термин за това, защото стандартът позволява на библиотеките да правят програмно неща с инстанции на класове, които дефинирате по предварително определен начин. Например, ако дадена библиотека иска да стриймва всеки обект, който ѝ подадете, тя знае, че може да го направи, защото обектът ви е сериализируем (ако приемем, че библиотеката изисква обектите ви да са подходящи JavaBeans).
Има термин за това, който го прави специален. Реалността далеч не е толкова загадъчна.
В общи линии това е "Bean":
java.io.Serializable
и го прави правилно), койтоgetFoo()
е getter за свойството "Foo"), иОбновяване:
Що се отнася до Serializable
: Това не е нищо друго освен "маркер интерфейс" (интерфейс, който не декларира никакви функции), който казва на Java, че класът, който го прилага, е съгласен (и предполага, че е способен на) "сериализация" -- процес, който превръща инстанция в поток от байтове. Тези байтове могат да се съхраняват във файлове, да се изпращат по мрежова връзка и т.н. и да съдържат достатъчно информация, за да позволят на JVM (поне на този, който знае за типа на обекта) да възстанови обекта по-късно - евентуално в друга инстанция на приложението или дори на съвсем друга машина!
Разбира се, за да може да направи това, класът трябва да се съобразява с определени ограничения. Основното сред тях е, че всички полета на инстанциите трябва да бъдат или примитивни типове (int, bool и т.н.), екземпляри на някой клас, който също е сериализуем, или да бъдат маркирани като преходни
, така че Java да не се опитва да ги включи. (Това, разбира се, означава, че преходните
полета няма да издържат пътуването по потока. Клас, който има преходни
полета, трябва да е готов да ги инициализира отново, ако е необходимо.)
Клас, който не може да се съобрази с тези ограничения, не трябва да имплементира Serializable
(и, IIRC, компилаторът на Java дори няма да му позволи да го направи).
Що се отнася до втората част на въпроса ви, сериализирането е механизъм за съхранение, използван за съхраняване на обекти като последователност от подписани байтове. По-малко формално казано, тя съхранява състоянието на обекта, така че да можете да го извлечете по-късно чрез десериализация.