[ÐопÑоÑÑ Ð´Ð»Ñ ÑобеÑедованиÑ](README.md) # СеÑиализаÑÐ¸Ñ + [ЧÑо Ñакое _«ÑеÑиализаÑиÑ»_?](#ЧÑо-Ñакое-ÑеÑиализаÑиÑ) + [ÐпиÑиÑе пÑоÑеÑÑ ÑеÑиализаÑии/деÑеÑиализаÑии Ñ Ð¸ÑполÑзованием `Serializable`.](#ÐпиÑиÑе-пÑоÑеÑÑ-ÑеÑиализаÑиидеÑеÑиализаÑии-Ñ-иÑполÑзованием-serializable) + [Ðак измениÑÑ ÑÑандаÑÑное поведение ÑеÑиализаÑии/деÑеÑиализаÑии?](#Ðак-измениÑÑ-ÑÑандаÑÑное-поведение-ÑеÑиализаÑиидеÑеÑиализаÑии) + [Ðак иÑклÑÑиÑÑ Ð¿Ð¾Ð»Ñ Ð¸Ð· ÑеÑиализаÑии?](#Ðак-иÑклÑÑиÑÑ-полÑ-из-ÑеÑиализаÑии) + [ЧÑо обознаÑÐ°ÐµÑ ÐºÐ»ÑÑевое Ñлово `transient`?](#ЧÑо-обознаÑаеÑ-клÑÑевое-Ñлово-transient) + [Ðакое влиÑние оказÑваÑÑ Ð½Ð° ÑеÑиализÑемоÑÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑоÑÑ Ð¿Ð¾Ð»ÐµÐ¹ `static` и `final`](#Ðакое-влиÑние-оказÑваÑÑ-на-ÑеÑиализÑемоÑÑÑ-модиÑикаÑоÑÑ-полей-static-и-final) + [Ðак не допÑÑÑиÑÑ ÑеÑиализаÑиÑ?](#Ðак-не-допÑÑÑиÑÑ-ÑеÑиализаÑиÑ) + [Ðак ÑоздаÑÑ ÑобÑÑвеннÑй пÑоÑокол ÑеÑиализаÑии?](#Ðак-ÑоздаÑÑ-ÑобÑÑвеннÑй-пÑоÑокол-ÑеÑиализаÑии) + [ÐÐ°ÐºÐ°Ñ ÑÐ¾Ð»Ñ Ð¿Ð¾Ð»Ñ `serialVersionUID` в ÑеÑиализаÑии?](#ÐакаÑ-ÑолÑ-полÑ-serialversionuid-в-ÑеÑиализаÑии) + [Ðогда ÑÑÐ¾Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð·Ð½Ð°Ñение Ð¿Ð¾Ð»Ñ `serialVersionUID`?](#Ðогда-ÑÑоиÑ-изменÑÑÑ-знаÑение-полÑ-serialversionuid) + [Ð Ñем пÑоблема ÑеÑиализаÑии Singleton?](#Ð-Ñем-пÑоблема-ÑеÑиализаÑии-singleton) + [Ðакие ÑÑÑеÑÑвÑÑÑ ÑпоÑÐ¾Ð±Ñ ÐºÐ¾Ð½ÑÑÐ¾Ð»Ñ Ð·Ð° знаÑениÑми деÑеÑиализованного обÑекÑа](#Ðакие-ÑÑÑеÑÑвÑÑÑ-ÑпоÑобÑ-конÑÑолÑ-за-знаÑениÑми-деÑеÑиализованного-обÑекÑа) ## ЧÑо Ñакое _«ÑеÑиализаÑиÑ»_? __СеÑиализаÑÐ¸Ñ (Serialization)__ - пÑоÑеÑÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð² линейнÑÑ Ð¿Ð¾ÑледоваÑелÑноÑÑÑ Ð±Ð°Ð¹Ñов Ð´Ð»Ñ Ð´Ð°Ð»ÑнейÑей пеÑедаÑи или ÑÐ¾Ñ ÑанениÑ. СеÑиализованнÑе обÑекÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ заÑем воÑÑÑановиÑÑ (деÑеÑиализоваÑÑ). Ð Java, ÑоглаÑно ÑпеÑиÑикаÑии Java Object Serialization ÑÑÑеÑÑвÑÐµÑ Ð´Ð²Ð° ÑÑандаÑÑнÑÑ ÑпоÑоба ÑеÑиализаÑии: ÑÑандаÑÑÐ½Ð°Ñ ÑеÑиализаÑиÑ, ÑеÑез иÑполÑзование инÑеÑÑейÑа `java.io.Serializable` и «ÑаÑÑиÑеннаÑ» ÑеÑиализаÑÐ¸Ñ - `java.io.Externalizable`. СеÑиализаÑÐ¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð² опÑеделеннÑÑ Ð¿ÑÐµÐ´ÐµÐ»Ð°Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ ÐºÐ»Ð°ÑÑ. ÐÐ¾Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ важнÑе изменениÑ, Ñ ÐºÐ¾ÑоÑÑми ÑпеÑиÑикаÑÐ¸Ñ Java Object Serialization Ð¼Ð¾Ð¶ÐµÑ ÑпÑавлÑÑÑÑÑ Ð°Ð²ÑомаÑиÑеÑки: + добавление в клаÑÑ Ð½Ð¾Ð²ÑÑ Ð¿Ð¾Ð»ÐµÐ¹; + изменение полей из ÑÑаÑиÑеÑÐºÐ¸Ñ Ð² неÑÑаÑиÑеÑкие; + изменение полей из ÑÑанзиÑнÑÑ Ð² неÑÑанзиÑнÑе. ÐбÑаÑнÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (из неÑÑаÑиÑеÑÐºÐ¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ в ÑÑаÑиÑеÑкие и из неÑÑанзиÑнÑÑ Ð² ÑÑанзиÑнÑе) или Ñдаление полей ÑÑебÑÑÑ Ð¾Ð¿Ñеделенной дополниÑелÑной обÑабоÑки в завиÑимоÑÑи Ð¾Ñ Ñого, ÐºÐ°ÐºÐ°Ñ ÑÑÐµÐ¿ÐµÐ½Ñ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð°. [к оглавлениÑ](#СеÑиализаÑиÑ) ## ÐпиÑиÑе пÑоÑеÑÑ ÑеÑиализаÑии/деÑеÑиализаÑии Ñ Ð¸ÑполÑзованием `Serializable`. ÐÑи иÑполÑзовании Serializable пÑименÑеÑÑÑ Ð°Ð»Ð³Ð¾ÑиÑм ÑеÑиализаÑии, коÑоÑÑй Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑеÑлекÑии (Reflection API) вÑполнÑеÑ: + запиÑÑ Ð² поÑок меÑаданнÑÑ Ð¾ клаÑÑе, аÑÑоÑииÑованном Ñ Ð¾Ð±ÑекÑом (Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа, иденÑиÑикаÑÐ¾Ñ `SerialVersionUID`, иденÑиÑикаÑоÑÑ Ð¿Ð¾Ð»ÐµÐ¹ клаÑÑа); + ÑекÑÑÑивнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² поÑок опиÑÐ°Ð½Ð¸Ñ ÑÑпеÑклаÑÑов до клаÑÑа `java.lang.Object` (не вклÑÑиÑелÑно); + запиÑÑ Ð¿ÑимиÑивнÑÑ Ð·Ð½Ð°Ñений полей ÑеÑиализÑемого ÑкземплÑÑа, наÑÐ¸Ð½Ð°Ñ Ñ Ð¿Ð¾Ð»ÐµÐ¹ Ñамого веÑÑ Ð½ÐµÐ³Ð¾ ÑÑпеÑклаÑÑа; + ÑекÑÑÑивнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¾Ð±ÑекÑов, коÑоÑÑе ÑвлÑÑÑÑÑ Ð¿Ð¾Ð»Ñми ÑеÑиализÑемого обÑекÑа. ÐÑи ÑÑом Ñанее ÑеÑиализованнÑе обÑекÑÑ Ð¿Ð¾Ð²ÑоÑно не ÑеÑиализÑÑÑÑÑ, ÑÑо позволÑÐµÑ Ð°Ð»Ð³Ð¾ÑиÑÐ¼Ñ ÐºÐ¾ÑÑекÑно ÑабоÑаÑÑ Ñ ÑиклиÑеÑкими ÑÑÑлками. ÐÐ»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´ÐµÑеÑиализаÑии под обÑÐµÐºÑ Ð²ÑделÑеÑÑÑ Ð¿Ð°Ð¼ÑÑÑ, поÑле Ñего его Ð¿Ð¾Ð»Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÑÑÑÑÑ Ð·Ð½Ð°ÑениÑми из поÑока. ÐонÑÑÑÑкÑÐ¾Ñ Ð¾Ð±ÑекÑа пÑи ÑÑом не вÑзÑваеÑÑÑ. Ðднако пÑи деÑеÑиализаÑии бÑÐ´ÐµÑ Ð²Ñзван конÑÑÑÑкÑÐ¾Ñ Ð±ÐµÐ· паÑамеÑÑов ÑодиÑелÑÑкого неÑеÑиализÑемого клаÑÑа, а его оÑÑÑÑÑÑвие повлеÑÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð´ÐµÑеÑиализаÑии. [к оглавлениÑ](#СеÑиализаÑиÑ) ## Ðак измениÑÑ ÑÑандаÑÑное поведение ÑеÑиализаÑии/деÑеÑиализаÑии? + РеализоваÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ `java.io.Externalizable`, коÑоÑÑй позволÑÐµÑ Ð¿Ñименение полÑзоваÑелÑÑкой логики ÑеÑиализаÑии. СпоÑоб ÑеÑиализаÑии и деÑеÑиализаÑии опиÑÑваеÑÑÑ Ð² меÑÐ¾Ð´Ð°Ñ `writeExternal()`` и `readExternal()`. Ðо вÑÐµÐ¼Ñ Ð´ÐµÑеÑиализаÑии вÑзÑваеÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ Ð±ÐµÐ· паÑамеÑÑов, а поÑом Ñже на Ñозданном обÑекÑе вÑзÑваеÑÑÑ Ð¼ÐµÑод `readExternal`. + ÐÑли Ñ ÑеÑиализÑемого обÑекÑа Ñеализован один из ÑледÑÑÑÐ¸Ñ Ð¼ÐµÑодов, Ñо Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ ÑеÑиализаÑии бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ ÐµÐ³Ð¾, а не меÑод по ÑмолÑÐ°Ð½Ð¸Ñ : + `writeObject()` - запиÑÑ Ð¾Ð±ÑекÑа в поÑок; + `readObject()` - ÑÑение обÑекÑа из поÑока; + `writeReplace()` - позволÑÐµÑ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ ÑÐµÐ±Ñ ÑкземплÑÑом дÑÑгого клаÑÑа пеÑед запиÑÑÑ; + `readResolve()` - позволÑÐµÑ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ Ð½Ð° ÑÐµÐ±Ñ Ð´ÑÑгой обÑÐµÐºÑ Ð¿Ð¾Ñле ÑÑениÑ. [к оглавлениÑ](#СеÑиализаÑиÑ) ## Ðак иÑклÑÑиÑÑ Ð¿Ð¾Ð»Ñ Ð¸Ð· ÑеÑиализаÑии? ÐÐ»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑеÑиализаÑией пÑи опÑеделении полей можно иÑполÑзоваÑÑ ÐºÐ»ÑÑевое Ñлово `transient`, Ñаким обÑазом иÑклÑÑив Ð¿Ð¾Ð»Ñ Ð¸Ð· обÑего пÑоÑеÑÑа ÑеÑиализаÑии. [к оглавлениÑ](#СеÑиализаÑиÑ) ## ЧÑо обознаÑÐ°ÐµÑ ÐºÐ»ÑÑевое Ñлово `transient`? ÐÐ¾Ð»Ñ ÐºÐ»Ð°ÑÑа, помеÑеннÑе модиÑикаÑоÑом `transient`, не ÑеÑиализÑÑÑÑÑ. ÐбÑÑно в ÑÐ°ÐºÐ¸Ñ Ð¿Ð¾Ð»ÑÑ Ñ ÑаниÑÑÑ Ð¿ÑомежÑÑоÑное ÑоÑÑоÑние обÑекÑа, коÑоÑое, к пÑимеÑÑ, пÑоÑе вÑÑиÑлиÑÑ. ÐÑÑгой пÑÐ¸Ð¼ÐµÑ Ñакого Ð¿Ð¾Ð»Ñ - ÑÑÑлка на ÑкземплÑÑ Ð¾Ð±ÑекÑа, коÑоÑÑй не ÑÑебÑÐµÑ ÑеÑиализаÑии или не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑеÑиализован. [к оглавлениÑ](#СеÑиализаÑиÑ) ## Ðакое влиÑние оказÑваÑÑ Ð½Ð° ÑеÑиализÑемоÑÑÑ Ð¼Ð¾Ð´Ð¸ÑикаÑоÑÑ Ð¿Ð¾Ð»ÐµÐ¹ `static` и `final` ÐÑи ÑÑандаÑÑной ÑеÑиализаÑии полÑ, имеÑÑие модиÑикаÑÐ¾Ñ static, не ÑеÑиализÑÑÑÑÑ. СооÑвеÑÑÑвенно, поÑле деÑеÑиализаÑии ÑÑо поле знаÑÐµÐ½Ð¸Ñ Ð½Ðµ менÑеÑ. ÐÑи иÑполÑзовании ÑеализаÑии `Externalizable` ÑеÑиализоваÑÑ Ð¸ деÑеÑиализоваÑÑ ÑÑаÑиÑеÑкое поле можно, но не ÑекомендÑеÑÑÑ ÑÑого делаÑÑ, Ñ.к. ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑопÑовождаÑÑÑÑ ÑÑÑдноÑловимÑми оÑибками. ÐÐ¾Ð»Ñ Ñ Ð¼Ð¾Ð´Ð¸ÑикаÑоÑом `final` ÑеÑиализÑÑÑÑÑ ÐºÐ°Ðº и обÑÑнÑе. Ðа одним иÑклÑÑением â Ð¸Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ деÑеÑиализоваÑÑ Ð¿Ñи иÑполÑзовании `Externalizable`, поÑколÑÐºÑ `final` Ð¿Ð¾Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¸Ð½Ð¸ÑиализиÑÐ¾Ð²Ð°Ð½Ñ Ð² конÑÑÑÑкÑоÑе, а поÑле ÑÑого в `readExternal()` измениÑÑ Ð·Ð½Ð°Ñение ÑÑого Ð¿Ð¾Ð»Ñ Ð±ÑÐ´ÐµÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾. СооÑвеÑÑÑвенно, еÑли Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑеÑиализоваÑÑ Ð¾Ð±ÑÐµÐºÑ Ñ `final` полем Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ иÑполÑзоваÑÑ ÑолÑко ÑÑандаÑÑнÑÑ ÑеÑиализаÑиÑ. [к оглавлениÑ](#СеÑиализаÑиÑ) ## Ðак не допÑÑÑиÑÑ ÑеÑиализаÑиÑ? ЧÑÐ¾Ð±Ñ Ð½Ðµ допÑÑÑиÑÑ Ð°Ð²ÑомаÑиÑеÑкÑÑ ÑеÑиализаÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ пеÑеопÑеделиÑÑ `private` меÑÐ¾Ð´Ñ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ÑклÑÑиÑелÑной ÑиÑÑаÑии `NotSerializableException`. ```java private void writeObject(ObjectOutputStream out) throws IOException { throw new NotSerializableException(); } private void readObject(ObjectInputStream in) throws IOException { throw new NotSerializableException(); } ``` ÐÑÐ±Ð°Ñ Ð¿Ð¾Ð¿ÑÑка запиÑаÑÑ Ð¸Ð»Ð¸ пÑоÑиÑаÑÑ ÑÑÐ¾Ñ Ð¾Ð±ÑÐµÐºÑ ÑепеÑÑ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÑ Ðº Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ð¸ÑклÑÑиÑелÑной ÑиÑÑаÑии. [к оглавлениÑ](#СеÑиализаÑиÑ) ## Ðак ÑоздаÑÑ ÑобÑÑвеннÑй пÑоÑокол ÑеÑиализаÑии? ÐÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑобÑÑвенного пÑоÑокола ÑеÑиализаÑии доÑÑаÑоÑно ÑеализоваÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ `Externalizable`, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð´Ð²Ð° меÑода: ```java public void writeExternal(ObjectOutput out) throws IOException; public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; ``` [к оглавлениÑ](#СеÑиализаÑиÑ) ## ÐÐ°ÐºÐ°Ñ ÑÐ¾Ð»Ñ Ð¿Ð¾Ð»Ñ `serialVersionUID` в ÑеÑиализаÑии? `serialVersionUID` иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ñказании веÑÑии ÑеÑиализованнÑÑ Ð´Ð°Ð½Ð½ÑÑ . Ðогда Ð¼Ñ Ð½Ðµ обÑÑвлÑем `serialVersionUID` в наÑем клаÑÑе Ñвно, ÑÑеда вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Java Ð´ÐµÐ»Ð°ÐµÑ ÑÑо за наÑ, но ÑÑÐ¾Ñ Ð¿ÑоÑеÑÑ ÑÑвÑÑвиÑелен ко многим меÑаданнÑм клаÑÑа вклÑÑÐ°Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑво полей, Ñип полей, модиÑикаÑоÑÑ Ð´Ð¾ÑÑÑпа полей, инÑеÑÑейÑов, коÑоÑÑе ÑÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ñ Ð² клаÑÑе и пÑ. РекомендÑеÑÑÑ Ñвно обÑÑвлÑÑÑ `serialVersionUID` Ñ.к. пÑи добавлении, Ñдалении аÑÑибÑÑов клаÑÑа динамиÑеÑки ÑгенеÑиÑованное знаÑение Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑÑÑ Ð¸ в Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑбÑоÑено иÑклÑÑение `InvalidClassException`. ```java private static final long serialVersionUID = 20161013L; ``` [к оглавлениÑ](#СеÑиализаÑиÑ) ## Ðогда ÑÑÐ¾Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑ Ð·Ð½Ð°Ñение Ð¿Ð¾Ð»Ñ `serialVersionUID`? `serialVersionUID` нÑжно изменÑÑÑ Ð¿Ñи внеÑении в клаÑÑ Ð½ÐµÑовмеÑÑимÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, напÑÐ¸Ð¼ÐµÑ Ð¿Ñи Ñдалении какого-либо его аÑÑибÑÑа. [к оглавлениÑ](#СеÑиализаÑиÑ) ## Ð Ñем пÑоблема ÑеÑиализаÑии Singleton? ÐÑоблема в Ñом ÑÑо поÑле деÑеÑиализаÑии Ð¼Ñ Ð¿Ð¾Ð»ÑÑим дÑÑгой обÑекÑ. Таким обÑазом, ÑеÑиализаÑÐ¸Ñ Ð´Ð°ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑоздаÑÑ Singleton еÑе Ñаз, ÑÑо недопÑÑÑимо. СÑÑеÑÑвÑÐµÑ Ð´Ð²Ð° ÑпоÑоба избежаÑÑ ÑÑого: + ÑвнÑй запÑÐµÑ ÑеÑиализаÑии. + опÑеделение меÑода Ñ ÑигнаÑÑÑой `(default/public/private/protected/) Object readResolve() throws ObjectStreamException`, назнаÑением коÑоÑого ÑÑÐ°Ð½ÐµÑ Ð²Ð¾Ð·Ð²ÑÐ°Ñ Ð·Ð°Ð¼ÐµÑаÑÑего обÑекÑа вмеÑÑо обÑекÑа, на коÑоÑом он вÑзван. [к оглавлениÑ](#СеÑиализаÑиÑ) ## Ðакие ÑÑÑеÑÑвÑÑÑ ÑпоÑÐ¾Ð±Ñ ÐºÐ¾Ð½ÑÑÐ¾Ð»Ñ Ð·Ð° знаÑениÑми деÑеÑиализованного обÑекÑа ÐÑли еÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÑÑÐ¾Ð»Ñ Ð·Ð° знаÑениÑми деÑеÑиализованного обÑекÑа, Ñо можно иÑполÑзоваÑÑ Ð¸Ð½ÑеÑÑÐµÐ¹Ñ `ObjectInputValidation` Ñ Ð¿ÐµÑеопÑеделением меÑода `validateObject()`. ```java // ÐÑли вÑзваÑÑ Ð¼ÐµÑод validateObject() поÑле деÑеÑиализаÑии обÑекÑа, Ñо бÑÐ´ÐµÑ Ð²Ñзвано иÑклÑÑение InvalidObjectException пÑи знаÑении возÑаÑÑа за пÑеделами 39...60. public class Person implements java.io.Serializable, java.io.ObjectInputValidation { ... @Override public void validateObject() throws InvalidObjectException { if ((age < 39) || (age > 60)) throw new InvalidObjectException("Invalid age"); } } ``` Так же ÑÑÑеÑÑвÑÑÑ ÑпоÑÐ¾Ð±Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑÐ²Ð°Ð½Ð¸Ñ Ð¸ ÑиÑÑованиÑ, позволÑÑÑие ÑбедиÑÑÑÑ, ÑÑо даннÑе не бÑли измененÑ: + Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð»Ð¾Ð³Ð¸ÐºÐ¸ в `writeObject()` и `readObject()`. + помеÑÑиÑÑ Ð² обеÑÑоÑнÑй клаÑÑ `javax.crypto.SealedObject` и/или `java.security.SignedObject`. ÐаннÑе клаÑÑÑ ÑвлÑÑÑÑÑ ÑеÑиализÑемÑми, поÑÑÐ¾Ð¼Ñ Ð¿Ñи обоÑаÑивании обÑекÑа в `SealedObject` ÑоздаеÑÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð¸Ðµ «подаÑоÑной Ñпаковки» вокÑÑг иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ обÑекÑа. ÐÐ»Ñ ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑоздаÑÑ ÑиммеÑÑиÑнÑй клÑÑ, ÑпÑавление коÑоÑÑм должно оÑÑÑеÑÑвлÑÑÑÑÑ Ð¾ÑделÑно. ÐналогиÑно, Ð´Ð»Ñ Ð¿ÑовеÑки даннÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ ÐºÐ»Ð°ÑÑ `SignedObject`, Ð´Ð»Ñ ÑабоÑÑ Ñ ÐºÐ¾ÑоÑÑм Ñакже нÑжен ÑиммеÑÑиÑнÑй клÑÑ, ÑпÑавлÑемÑй оÑделÑно. [к оглавлениÑ](#СеÑиализаÑиÑ) # ÐÑÑоÑники + [IBM developerWorks](https://www.ibm.com/developerworks/ru/library/j-5things1/) + [Java-online.ru](http://java-online.ru/blog-serialization.xhtml) + [ÐзÑÑиÑе ÑекÑеÑÑ Java Serialization API](http://ccfit.nsu.ru/~deviv/courses/oop/java_ser_rus.html) + [JavaRush](http://bit.ly/1xwRA2D) + [ÐапиÑки ÑÑезвого пÑакÑика](http://www.skipy.ru/technics/serialization.html) [ÐопÑоÑÑ Ð´Ð»Ñ ÑобеÑедованиÑ](README.md)