Који је концепт сериализације у Јави?



Овај чланак ће вам помоћи у свеобухватном приступу концепту сериализације у Јави, заједно са примерима у реалном времену за боље разумевање.

Серијализација у је важан концепт који се бави претварањем објеката у ток бајтова за транспорт јава објеката из једне Јава виртуелне машине у другу и њихово поновно стварање у изворном облику. Довезу за овај чланак поставићу на следећи начин:

Шта је сериализација у Јави?

Серијализација у Јави је процес конверзије Јава кода Предмет у а Бите Стреам , да пренесе објектни код са једне Јава виртуелне машине на другу и поново га креира помоћу процеса Десериализација.





Serialization-in-Java-Edureka-Picture-1

Зашто нам је потребна сериализација на Јави ?

Серијализација нам је потребна из следећих разлога:



  • Комуникација : Серијализација укључује поступак објекта сериализација и преношење. Ово омогућава више рачунарских система да истовремено пројектују, деле и извршавају објекте.

  • Кеширање : Време утрошено за изградњу објекта је више у поређењу са временом потребним за његову уклањање сериализације. Серијализација минимизира потрошњу времена за кеширање џиновски предмети.

  • Дееп Цопи : Клонирање поступак је поједностављен коришћењем сериализације. Тачно реплика предмета добија се помоћусериализовањем предмета на а бајтни низ , а затим и де-сериализује.



  • Крст ЈВМ синхронизација: Главна предност сериализације је у томе шторади на различитим ЈВМ-овима који се можда изводе на различитим архитектуре или Оперативни системи

  • Упорност: Стање било ког објекта може се директно сачувати применом сериализације на њега и сачувати у а база података тако да може бити преузето касније.

Како да сериализујемо објекат?

ДО Јава објект је сериализабле ако и само ако његова класа или било која од родитељских класа примењује или јава . Ја . Сериализабле интерфејс или његов подинтерфејс, јава.ио.Ектернализабле.

У процесу сериализације претварамо стање објекта у бајтни ток како би могао да се пренесе из једног ЈВМ-а у други и врати бајтни ток назад у оригинални објекат.

//Приступ

пакет Сериал1 импорт јава.ио.Сериализабле публиц цласс Емплоиее имплементира Сериализабле {привате статиц финал лонг сериалВерсионУИД = 1Л // Сериал Версион УИД инт ид Име низа публиц Емплоиее (инт ид, Стринг наме) {тхис.ид = ид тхис.наме = наме }}

// Сериализе

пакет Сериал1 импорт јава.ио. * цласс Персист {публиц статиц воид маин (Стринг аргс []) {три {Емплоиее емп1 = нев Емплоиее (20110, 'Јохн') Емплоиее емп2 = нев Емплоиее (22110, 'Јерри') Емплоиее емп3 = нев Емплоиее (20120, 'Сам') ФилеОутпутСтреам фоут = нев ФилеОутпутСтреам ('оутпут.ткт') ОбјецтОутпутСтреам оут = нев ОбјецтОутпутСтреам (фоут) оут.вритеОбјецт (емп1) оут.вритеОбјецт (емп2) оут.вритеОбјецт (емп3) оут. флусх () оут.цлосе () Систем.оут.принтлн ('Серијализација и десеријализација су успешно извршене')} цатцх (Изузетак е) {Систем.оут.принтлн (е)}}}

Излаз:

Серијализација и десеријализација су успешно изведени

Десериализација : То је обрнути процес сериализације где се серијски бајтни ток објекта од пошиљаоца креира на крају пријема.

// Десериалисе

пакет Сериал1 импорт јава.ио. * цласс Деперсист {публиц статиц воид маин (Стринг аргс []) {три {ОбјецтИнпутСтреам ин = нев ОбјецтИнпутСтреам (нев ФилеИнпутСтреам ('оутпут.ткт')) Емплоиее е1 = (Емплоиее) ин.реадОбјецт ( ) Запослени е2 = (Запослени) ин.реадОбјецт () Запослени е3 = (Запослени) ин.реадОбјецт () Систем.оут.принтлн (е1.ид + '' + е1.наме) Систем.оут.принтлн (е2.ид + '' + е2.наме) Систем.оут.принтлн (е3.ид + '' + е3.наме) ин.цлосе ()} цатцх (Изузетак е) {Систем.оут.принтлн (е)}}}

Излаз:

20110 Јован
22110 Џери

20120 Сам

Предности и недостаци сериализације у Јави

Предности:

  • Процес сериализације је уграђени функција која не захтева софтвер независних произвођача за извршавање сериализације
  • Доказано је да је поступак сериализације једноставно и лако разумети

  • Поступак сериализације је универзалан и програмери из различитих позадина су му познати

  • Једноставан је за употребу и једноставно прилагодити

  • Серијализовани токови података подржавају шифровање, компресију, аутентификацију и безбедно Јава рачунарство

  • Има их много критичне технологије ослањајући се на сериализацију.

Мане:

претварање доубле у инт у јави

  • Објекти док ДеСериализатион постаје крт и нису сигурни да ће бити ефикасно деСериализовани.

  • Привремене променљиве декларисане док сериализација ствара меморијски простор, али конструктор се не позива што резултира неуспехом у иницијализацији пролазних променљивих што резултира варијација стандардног Јава тока.

  • Процес сериализације је неефикасан у погледу коришћења меморије.

  • Серијализација није пожељнија за употребу у апликацијама које требају истовремени приступ без захтева од независни АПИ-ји , јер сериализација не нуди механизам контроле транзиције по сваком СЕ.

  • Поступак сериализације не нуди фино зрнаста контрола за приступ Објектима.

Практични примери сериализације у Јави

Серијализација коришћењем наслеђа

Случај - 1: Ако је Суперцласс могуће сериализовати, тада су, према подразумеваним вредностима, његове подкласе такође могуће сериализовати.

У овом случају, поткласа је серијски подразумијевано ако је суперкласа спроводи Серијализован интерфејс

пакет СериализатионИнхеританце импорт јава.ио.ФилеИнпутСтреам импорт јава.ио.ФилеОутпутСтреам импорт јава.ио.ОбјецтИнпутСтреам импорт јава.ио.ОбјецтОутпутСтреам импорт јава.ио.Сериализабле цласс А имплементира Сериализабле {инт и публиц А (инт и) {тхис.и = и}} класа Б проширује А {инт ј публиц Б (инт и, инт ј) {супер (и) тхис.ј = ј}} тест јавне класе {публиц статиц воид маин (Стринг [] аргс) баца изузетак {Б б1 = нови Б (200.400) Систем.оут.принтлн ('и =' + б1.и) Систем.оут.принтлн ('ј =' + б1.ј) ФилеОутпутСтреам фос = нови ФилеОутпутСтреам ('абц.сер') ОбјецтОутпутСтреам оос = нев ОбјецтОутпутСтреам (фос) оос.вритеОбјецт (б1) оос.цлосе () фос.цлосе () Систем.оут.принтлн ('Објект је сериализован') ФилеИнпутСтреам фис = нев ФилеИнпутСтреам ('абц.сер') ОбјецтИнпутСтреам оис = нови ОбјецтИнпутСтреам (фис) Б б2 = (Б) оис.реадОбјецт () оис.цлосе () фис.цлосе () Систем.оут.принтлн ('Објекат је десериализован') Систем.оут.принтлн ('и = '+ б2.и) Систем.оут.принтлн (' ј = '+ б2.ј)}}

Излаз:

ј = 20
Предмет је сериализован
Објекат је десериализован
и = 200
ј = 400

Случај - 2: Подкласа се може сериализовати ако имплементира серијски интерфејс, чак и ако суперкласа не примењује серијски интерфејс.

У овом случају, ако суперкласа не спроводи Серијализован интерфејс , затим, објекти поткласа може се ручно сериализовати применом серијског интерфејса у поткласу.

пакет СериализатионИнхеританце импорт јава.ио.ФилеИнпутСтреам импорт јава.ио.ФилеОутпутСтреам импорт јава.ио.ОбјецтИнпутСтреам импорт јава.ио.ОбјецтОутпутСтреам импорт јава.ио.Сериализабле суперцласс цласс {инт и публиц суперцласс (инт и) {тхис.и = и} јавна суперкласа () {и = 50 Систем.оут.принтлн ('конструктор суперкласе назван')}} класа подкласа проширује суперкласу имплементира Сериализабле {инт ј јавна подкласа (инт и, инт ј) {супер (и) тхис.ј = ј }} публиц цласс тест2 {публиц статиц воид маин (Стринг [] аргс) баца изузетак {подкласа б1 = нова подкласа (10, 20) Систем.оут.принтлн ('и =' + б1.и) Систем.оут.принтлн ( 'ј =' + б1.ј) ФилеОутпутСтреам фос = нев ФилеОутпутСтреам ('оутпут.сер') ОбјецтОутпутСтреам оос = нев ОбјецтОутпутСтреам (фос) оос.вритеОбјецт (б1) оос.цлосе () фос.цлосе () Систем.оут.принтлн ('Објект је сериализован') ФилеИнпутСтреам фис = нови ФилеИнпутСтреам ('оутпут.сер') ОбјецтИнпутСтреам оис = нови ОбјецтИнпутСтреам (фис) поткласа б2 = (поткласа) оис.реадОбјецт ( ) оис.цлосе () фис.цлосе () Систем.оут.принтлн ('Објекат је десериализован') Систем.оут.принтлн ('и =' + б2.и) Систем.оут.принтлн ('ј =' + б2.ј)}}

Предмет је сериализован
Конструктор суперкласе позван
Објекат је десериализован
и = 50
ј = 20

Случај - 3: Ако је суперкласа сериализујућа, али не треба да се поткласа сериализује.

У овом случају, сериализација поткласе може бити спреченаприменом вритеОбјецт () и реадОбјецт () методе у подразреду и треба га бацити НотСериализаблеЕкцептион из ових метода.

пакет СериализатионИнхеританце импорт јава.ио.ФилеИнпутСтреам импорт јава.ио.ФилеОутпутСтреам импорт јава.ио.ИОЕкцептион импорт јава.ио.НотСериализаблеЕкцептион импорт јава.ио.ОбјецтИнпутСтреам импорт јава.ио.ОбјецтОутпутСтреам импорт јава.иорент Парент. и публиц Парент (инт и) {тхис.и = и}} класа дете продужује Парент {инт ј публиц цхилд (инт и, инт ј) {супер (и) тхис.ј = ј} привате воид вритеОбјецт (ОбјецтОутпутСтреам оут) баца ИОЕкцептион {тхров нев НотСериализаблеЕкцептион ()} привате воид реадОбјецт (ОбјецтИнпутСтреам ин) баца ИОЕкцептион {тхров нев НотСериализаблеЕкцептион ()}} публиц цласс тест3 {публиц статиц воид маин (Стринг [] аргс) баца изузетак {цхилд б1 = нев цхилд (100, 200) Систем.оут.принтлн ('и =' + б1.и) Систем.оут.принтлн ('ј =' + б1.ј) ФилеОутпутСтреам фос = нев ФилеОутпутСтреам ('абц.сер') ОбјецтОутпутСтреам оос = нев ОбјецтОутпутСтреам ( фос) оос.вритеОбјецт (б1) оос.цлосе () фос.цлосе () Систем.оут.принтлн ('Објекат је сериализовано ') ФилеИнпутСтреам фис = нев ФилеИнпутСтреам (' абц.сер ') ОбјецтИнпутСтреам оис = нев ОбјецтИнпутСтреам (фис) цхилд б2 = (цхилд) оис.реадОбјецт () оис.цлосе () фис.цлосе () Систем.оут. принтлн ('Објекат је десериализован') Систем.оут.принтлн ('и =' + б2.и) Систем.оут.принтлн ('ј =' + б2.ј)}}

Излаз:

и = 100
ј = 200
Изузетак у нити 'маин' јава.ио.НотСериализаблеЕкцептион
на СериализатионИнхеританце.цхилд.вритеОбјецт (тест3.јава:48)
ат сун.рефлецт.НативеМетходАццессорИмпл.инвоке0 (Нативе Метход)

Серијализација помоћу статичког члана

Серијализација поља статичког члана се занемарује у процесу сериализације. Серијализација јевезано за најновије стање објекта. Дакле, само су подаци повезани са одређеном инстанцом класесериализовано, али не и поље статичког члана.

пакет стати импорт јава.ио. * класа СтатицСериал имплементира Сериализабле {статиц инт и = 100 публиц статиц воид маин (Стринг ... ар) {СтатицСериал об = нев СтатицСериал () Систем.оут.принтлн ('У време сериализације, статички члан има вредност: '+ и) три {ФилеОутпутСтреам фос = нев ФилеОутпутСтреам (' Ф: Филе.сер ') ОбјецтОутпутСтреам оос = нев ОбјецтОутпутСтреам (фос) оос.вритеОбјецт (об) оос.цлосе () и = 99 ФилеИнпутСтреам фис = нев ФилеИнпутСтреам ('Ф: Филе.сер') ОбјецтИнпутСтреам оис = нев ОбјецтИнпутСтреам (фис) об = (СтатицСериал) оис.реадОбјецт () оис.цлосе () Систем.оут.принтлн ('Након десеријализације, статични члан има вредност:' + и)} улов (изузетак е) {Систем.оут.принтлн (е)}}}

Излаз:

У време сериализације, статички члан има вредност: 100
Након десеријализације, статички члан има вредност: 99

Ектернализабле Интерфаце

Тхе Ектернализабле Интерфаце у Јави је сличан сериализацији, али једина разлика је у томе што је способан да понуди прилагођена сериализација где можете да одлучите о објектима који ће се врезати у току.

Интерфејс за екстернализацију доступан је у јава.ио и пружа две методе:

  • публиц воид вритеЕктернал (ОбјецтОутпут оут) баца ИОЕкцептион
  • јавна празнина реадЕктернал (ОбјецтИнпут ин) баца ИОЕкцептион

Кључне разлике између сериализације и екстернализације су следеће:

  • Имплементација : Интерфејс који се може екстернализовати изузима корисника у експлицитно поменути предмете који ће се серијализовати. Док су у интерфејсу за сериализацију, сви објекти и променљиве су сериализовани у време извођења.

  • Методе : Интерфејс који се може екстернализовати састоји се од две методе, и то:

    • вритеЕктернал ()

    • реадЕктернал ()

С друге стране, Сериализабле Интерфаце не укључује никакве методе.

  • Процес: Процес сериализације у Ектернализабле Интерфаце пружа Подешавање до процеса сериализације. Али, интерфејс за сериализацију ће пружити Уобичајено процес сериализације.

  • Уназад компатабилност и контрола: Ектернализабле Интерфаце подржава сериализацију без обзира на контрола верзија а једини проблем је што корисник мора бити одговоран док врши сериализацију Супер класе. С друге стране, интерфејс за сериализацију захтева иста верзија ЈВМ-ова на оба краја, али укључује аутоматску сериализацију свих објеката и класа, укључујући суперкласу.

  • Јавни конструктор без аргумената: Потребно је сучеље за екстернализацију Јавни конструктор без аргумената за реконструкцију сериализованог објекта. Иако интерфејс за сериализацију не захтева Но-Арг Цонструцтор, уместо тога користи одраз за реконструкцију сериализованог објекта или класе.

пакет ект импорт јава.ио. * цласс Демо имплементира јава.ио.Сериализабле {публиц инт а публиц Стринг б публиц Демо (инт а, Стринг б) {тхис.а = а тхис.б = б}} Тест класе {публиц статиц воид маин (Стринг [] аргс) {Демо објецт = нев Демо (1, 'Велцоме то Едурека') Стринг филенаме = 'филе.сер' три {ФилеОутпутСтреам филе = нев ФилеОутпутСтреам (филенаме) ОбјецтОутпутСтреам оут = нев ОбјецтОутпутСтреам (филе) оут .вритеОбјецт (објецт) оут.цлосе () филе.цлосе () Систем.оут.принтлн ('Објект је сериализован')} цатцх (ИОЕкцептион ек) {Систем.оут.принтлн ('ИОЕкцептион ис цаугхт')} Демо објецт1 = нулл три {ФилеИнпутСтреам филе = нев ФилеИнпутСтреам (филенаме) ОбјецтИнпутСтреам ин = нев ОбјецтИнпутСтреам (филе) објецт1 = (Демо) ин.реадОбјецт () ин.цлосе () филе.цлосе () Систем.оут.принтлн ('Објекат је десериализовано ') Систем.оут.принтлн (' а = '+ објецт1.а) Систем.оут.принтлн (' б = '+ објецт1.б)} цатцх (ИОЕкцептион ек) {Систем.оут.принтлн (' ИОЕкцептион ис цаугхт ')} цатцх (ЦлассНотФоундЕкцептион ек) {Систем.оут .принтлн ('ЦлассНотФоундЕкцептион је ухваћен')}}}

Привремена кључна реч

Привремена кључна реч је резервисана кључна реч на Јави. Користи се као променљива модификовати у време процеса сериализације. Декларирање променљиве помоћу кључне речи Трансиент избегава да се променљива сериализује.

УИД серијске верзије

Пре него што започне процес сериализације, свака класа / објекат који се може серирати може се повезати са Јединствени матични број обезбеђује ЈВМ хост машине. Овај јединствени ИД се зове УИД серијске верзије . Овај УИД се користи као идентификацију од стране ЈВМ-а примајућег краја да би се потврдило да се исти објекат десериализује на пријемном крају.

Контроверзе сериализације у Јави

Орацле-а Архитекте намеравају да уклоне сериализацију са Јаве како је сматрају Ужасна грешка из 1997 . Након ужурбаног истраживања, програмери у Орацлеу открили су неколико недостатака у дизајну поступка сериализације који представљају претњу за податке.

1997. год.Марк Реинхолд каже - „ Ми волимо да називамо сериализацију „поклоном који наставља да даје“, а врста поклона који даје даје су сигурносне рањивости. Вероватно је трећина свих Јава рањивости укључена у сериализацију, што би могло бити и преко половине. То је запањујуће плодни извор рањивости, а да не помињемо нестабилности. “.

Постоје шансе да би се серијализација уклонила или заменила у предстојећим ажурирањима Јаве, а с друге стране, за почетнике у Јави, сериализација није могао бити идеалистичка опција у својим пројектима

Најбоље праксе током коришћења сериализације у Јави

Следи неколико најбољих пракси које треба следити

  • Препоручује се употреба јавадоц @ серијска ознака за означавање поља која се могу серирати.
  • Тхе .бити екстензија је пожељнија за употребу за датотеке које представљају сериализоване објекте.
  • Не препоручује се пролазак статичних или пролазних поља подразумевана сериализација.
  • Продужени часови не би требало да буде сериализовано уколико није обавезно.
  • Иннер Цлассес треба избегавати да буде укључен у сериализацију.

Овим смо дошли до краја овог чланка. Надам се да сте разумели основе сериализације у Јави, њене типове и функционалности.

која су ограничења у скл-у

Погледајте Едурека, поуздана компанија за учење на мрежи са мрежом од више од 250.000 задовољних ученика раширених широм света. Едурекин курс за обуку и сертификацију Јава Ј2ЕЕ и СОА дизајниран је за студенте и професионалце који желе да буду Јава програмер. Курс је дизајниран да вам пружи почетну предност у Јава програмирању и обучи вас за основне и напредне Јава концепте, заједно са разним Јава оквирима као што су Хибернате & Пролеће .

Имате питање за нас? Спомените то у одељку за коментаре овог чланка „Серијализација на Јави“ и јавићемо вам се што је пре могуће.