/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . serialization . descriptors Ċ Ċ import Ġkotlinx . serialization .* Ċ import Ġkotlinx . serialization . encoding .* Ċ Ċ /** Ċ Ġ* ĠSerial Ġdescriptor Ġis Ġan Ġin herent Ġproperty Ġof Ġ[ K Serializer ] Ġthat Ġdescribes Ġthe Ġstructure Ġof Ġthe Ġserial izable Ġtype . Ċ Ġ* ĠThe Ġstructure Ġof Ġthe Ġserial izable Ġtype Ġis Ġnot Ġonly Ġthe Ġproperty Ġof Ġthe Ġtype , Ġbut Ġalso Ġof Ġthe Ġserializer Ġas Ġwell , Ċ Ġ* Ġmeaning Ġthat Ġone Ġtype Ġcan Ġhave Ġmultiple Ġdescriptors Ġthat Ġhave Ġcompletely Ġdifferent Ġstructure . Ċ Ġ* Ċ Ġ* ĠFor Ġexample , Ġthe Ġclass Ġ` class ĠColor ( val Ġrgb : ĠInt )` Ġcan Ġhave Ġmultiple Ġserial izable Ġrepresentations , Ċ Ġ* Ġsuch Ġas Ġ`{" rgb ": Ġ 2 5 5 }`, Ġ`" # 0 0 0 0 FF "`, Ġ`[ 0 , Ġ 0 , Ġ 2 5 5 ]` Ġand Ġ`{" red ": Ġ 0 , Ġ" green ": Ġ 0 , Ġ" blue ": Ġ 2 5 5 }`. Ċ Ġ* ĠRepresent ations Ġare Ġdetermined Ġby Ġserializers Ġand Ġeach Ġsuch Ġserializer Ġhas Ġits Ġown Ġdescriptor Ġthat Ġidentifies Ċ Ġ* Ġeach Ġstructure Ġin Ġa Ġdistinguish able Ġand Ġformat - agnostic Ġmanner . Ċ Ġ* Ċ Ġ* Ġ### ĠStructure Ċ Ġ* ĠSerial Ġdescriptor Ġis Ġidentified Ġby Ġits Ġ[ name ][ serial Name ] Ġand Ġconsists Ġof Ġkind , Ġpotentially Ġempty Ġset Ġof Ċ Ġ* Ġchildren Ġelements Ġand Ġadditional Ġmetadata . Ċ Ġ* Ċ Ġ* Ġ* Ġ[ serial Name ] Ġuniquely Ġidentifies Ġthe Ġdescriptor Ġ( and Ġthe Ġcorresponding Ġserializer ) Ġfor Ġnon - generic Ġtypes . Ċ Ġ* ĠĠ ĠFor Ġgeneric Ġtypes , Ġthe Ġactual Ġtype Ġsubstitution Ġis Ġomitted Ġfrom Ġthe Ġstring Ġrepresentation Ġand Ġthe Ġname Ċ Ġ* ĠĠ Ġidentifies Ġthe Ġfamily Ġof Ġthe Ġserializers Ġwithout Ġtype Ġsubstitution s . ĠHowever , Ġtype Ġsubstitution Ġis Ġaccount ed Ċ Ġ* ĠĠ Ġin Ġ[ equals ] Ġand Ġ[ hashCode ] Ġoperations , Ġmeaning Ġthat Ġdescriptors Ġof Ġgeneric Ġclasses Ġwith Ġthe Ġsame Ġname , Ġbut Ġdifferent Ġtype Ċ Ġ* ĠĠ Ġparameters , Ġare Ġnot Ġequal Ġto Ġeach Ġother . Ċ Ġ* ĠĠ Ġ[ serial Name ] Ġis Ġtypically Ġused Ġto Ġspecify Ġthe Ġtype Ġof Ġthe Ġtarget Ġclass Ġduring Ġserialization Ġof Ġpol ymorphic Ġand Ġsealed Ċ Ġ* ĠĠ Ġclasses , Ġfor Ġobserv ability Ġand Ġdiagnostics . Ċ Ġ* Ġ* Ġ[ Kind ][ Serial Kind ] Ġdefines Ġwhat Ġthis Ġdescriptor Ġrepresents : Ġprimitive , Ġenum , Ġobject , Ġcollection Ġet Ġc et era . Ċ Ġ* Ġ* ĠChildren Ġelements Ġare Ġrepresented Ġas Ġserial Ġdescriptors Ġas Ġwell Ġand Ġdefine Ġthe Ġstructure Ġof Ġthe Ġtype 's Ġelements . Ċ Ġ* Ġ* ĠMetadata Ġcar ries Ġadditional Ġpotentially Ġuseful Ġinformation , Ġsuch Ġas Ġ[ null ability ][ nullable ], Ġ[ optional ity ][ is Element Optional ] Ċ Ġ* ĠĠ Ġand Ġ[ serial Ġannotations ][ getElement Annotations ]. Ċ Ġ* Ċ Ġ* Ġ### ĠUs ages Ċ Ġ* ĠThere Ġare Ġtwo Ġgeneral Ġusage s Ġof Ġthe Ġdescriptors : ĠTHE Ġserialization Ġprocess Ġand Ġserialization Ġint rospection . Ċ Ġ* Ċ Ġ* Ġ#### ĠSerialization Ċ Ġ* ĠSerial Ġdescriptor Ġis Ġused Ġas Ġbridge Ġbetween Ġde coders / en coders Ġand Ġserializers . Ċ Ġ* ĠWhen Ġasking Ġfor Ġa Ġnext Ġelement , Ġthe Ġserializer Ġprovides Ġan Ġexpected Ġdescriptor Ġto Ġthe Ġdecoder , Ġand , Ċ Ġ* Ġbased Ġon Ġthe Ġdescriptor Ġcontent , Ġdecoder Ġdec ides Ġhow Ġto Ġparse Ġits Ġinput . Ċ Ġ* ĠIn ĠJSON , Ġfor Ġexample , Ġwhen Ġthe Ġencoder Ġis Ġasked Ġto Ġencode Ġthe Ġnext Ġelement Ġand Ġthis Ġelement Ċ Ġ* Ġis Ġa Ġsubtype Ġof Ġ[ List ], Ġthe Ġencoder Ġreceives Ġa Ġdescriptor Ġwith Ġ[ Structure Kind . LIST ] Ġand , Ġbased Ġon Ġthat , Ċ Ġ* Ġfirst Ġwrites Ġan Ġopening Ġsquare Ġbracket Ġbefore Ġwriting Ġthe Ġcontent Ġof Ġthe Ġlist . Ċ Ġ* Ċ Ġ* ĠSerial Ġdescriptor Ġ_ enc aps ulates _ Ġthe Ġstructure Ġof Ġthe Ġdata , Ġso Ġserializers Ġcan Ġbe Ġfree Ġfrom Ċ Ġ* Ġformat - specific Ġdetails . Ġ` List Serializer ` Ġknows Ġnothing Ġabout ĠJSON Ġand Ġsquare Ġbrackets , Ġproviding Ċ Ġ* Ġonly Ġthe Ġstructure Ġof Ġthe Ġdata Ġand Ġdeleg ating Ġencoding Ġdecision Ġto Ġthe Ġformat Ġitself . Ċ Ġ* Ċ Ġ* Ġ#### ĠInt rospection Ċ Ġ* ĠAnother Ġusage Ġof Ġa Ġserial Ġdescriptor Ġis Ġtype Ġint rospection Ġwithout Ġits Ġserialization . Ċ Ġ* ĠInt rospection Ġcan Ġbe Ġused Ġto Ġcheck , Ġwhether Ġthe Ġgiven Ġserial izable Ġclass Ġcomp lies Ġthe Ċ Ġ* Ġcorresponding Ġscheme Ġand Ġto Ġgenerate ĠJSON Ġor ĠProto Buf Ġschema Ġfrom Ġthe Ġgiven Ġclass . Ċ Ġ* Ċ Ġ* Ġ### ĠInd ices Ċ Ġ* ĠSerial Ġdescriptor ĠAPI Ġoper ates Ġwith Ġchildren Ġindices . Ċ Ġ* ĠFor Ġthe Ġfixed - size Ġstructures , Ġsuch Ġas Ġregular Ġclasses , Ġindex Ġis Ġrepresented Ġby Ġa Ġvalue Ġin Ċ Ġ* Ġthe Ġrange Ġfrom Ġzero Ġto Ġ[ elements Count ] Ġand Ġrepresent Ġand Ġindex Ġof Ġthe Ġproperty Ġin Ġthis Ġclass . Ċ Ġ* ĠC onse quent ly , Ġprimitives Ġdo Ġnot Ġhave Ġchildren Ġand Ġtheir Ġelement Ġcount Ġis Ġzero . Ċ Ġ* Ċ Ġ* ĠFor Ġcollections Ġand Ġmaps , Ġthough , Ġindices Ġdoes Ġnot Ġhave Ġfixed Ġbound . ĠRegular Ġcollections Ġdescriptors Ġusually Ċ Ġ* Ġhave Ġone Ġelement Ġ(` T `, Ġmaps Ġhave Ġtwo , Ġone Ġfor Ġkeys Ġand Ġone Ġfor Ġvalues ), Ġbut Ġpotentially Ġun limited Ċ Ġ* Ġnumber Ġof Ġactual Ġchildren Ġvalues . ĠValid Ġindices Ġrange Ġis Ġnot Ġknown Ġstatic ally Ċ Ġ* Ġand Ġimplementations Ġof Ġdescriptor Ġshould Ġprovide Ġconsistent Ġand Ġun bounded Ġnames Ġand Ġindices . Ċ Ġ* Ċ Ġ* ĠIn Ġpractice , Ġfor Ġregular Ġclasses Ġit Ġis Ġallowed Ġto Ġinvoke Ġ` getElement *( index )` Ġmethods Ċ Ġ* Ġwith Ġan Ġindex Ġwithin Ġ` 0 Ġuntil Ġelements Count ` Ġrange Ġand Ġelement Ġat Ġthe Ġparticular Ġindex Ġcorresponds Ġto Ġthe Ċ Ġ* Ġserial izable Ġproperty Ġat Ġthe Ġgiven Ġposition . Ċ Ġ* ĠFor Ġcollections Ġand Ġmaps , Ġindex Ġparameter Ġfor Ġ` getElement *( index )` Ġmethods Ġis Ġeffectively Ġbound Ċ Ġ* Ġby Ġthe Ġmax imal Ġnumber Ġof Ġcollection / map Ġelements . Ċ Ġ* Ċ Ġ* Ġ### ĠThread - safety Ġand Ġmut ability Ċ Ġ* ĠSerial Ġdescriptor Ġimplementation Ġshould Ġbe Ġimmutable Ġand , Ġthus , Ġthread - safe . Ċ Ġ* Ċ Ġ* Ġ### ĠE quality Ġand Ġcaching Ċ Ġ* ĠSerial Ġdescriptor Ġcan Ġbe Ġused Ġas Ġa Ġunique Ġidentifier Ġfor Ġformat - specific Ġdata Ġor Ġschemas Ġand Ċ Ġ* Ġthis Ġimplies Ġthe Ġfollowing Ġrestrictions Ġon Ġits Ġ` equals ` Ġand Ġ` hashCode `: Ċ Ġ* ĠĠ Ġ* Ċ Ġ* Ċ Ġ* ĠAn Ġ[ equals ] Ġimplementation Ġshould Ġuse Ġboth Ġ[ serial Name ] Ġand Ġelements Ġstructure . Ċ Ġ* ĠComp aring Ġ[ element Descriptors ] Ġdirectly Ġis Ġdis cour aged , Ċ Ġ* Ġbecause Ġit Ġmay Ġcause Ġa Ġstack Ġoverflow Ġerror , Ġe . g . Ġif Ġa Ġserial izable Ġclass Ġ` T ` Ġcontains Ġelements Ġof Ġtype Ġ` T `. Ċ Ġ* ĠTo Ġavoid Ġit , Ġa Ġserial Ġdescriptor Ġimplementation Ġshould Ġcompare Ġonly Ġdescriptors Ċ Ġ* Ġof Ġclass ' Ġtype Ġparameters , Ġin Ġa Ġway Ġthat Ġ` serializer < Box < Int >> (). descriptor Ġ!= Ġserializer < Box < String >> (). descriptor `. Ċ Ġ* ĠIf Ġtype Ġparameters Ġare Ġequal , Ġdescriptors Ġstructure Ġshould Ġbe Ġcompared Ġby Ġusing Ġchildren Ġelements Ċ Ġ* Ġdescriptors ' Ġ[ serial Name ] s , Ġwhich Ġcorrespond Ġto Ġclass Ġnames Ċ Ġ* Ġ( do Ġnot Ġconf use Ġwith Ġelements Ġown Ġnames , Ġwhich Ġcorrespond Ġto Ġproperties Ġnames ); Ġand / or Ġother Ġ[ Serial Descriptor ] Ċ Ġ* Ġproperties , Ġsuch Ġas Ġ[ kind ]. Ċ Ġ* ĠAn Ġexample Ġof Ġ[ equals ] Ġimplementation : Ċ Ġ* Ġ``` Ċ Ġ* Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue Ċ Ġ* Ġif Ġ( other :: class Ġ!= Ġthis :: class ) Ġreturn Ġfalse Ċ Ġ* Ġif Ġ( serial Name Ġ!= Ġother . serial Name ) Ġreturn Ġfalse Ċ Ġ* Ġif Ġ(! type Parameters AreEqual ( other )) Ġreturn Ġfalse Ċ Ġ* Ġif Ġ( this . element Descriptors (). map Ġ{ Ġit . serial Name Ġ} Ġ!= Ġother . element Descriptors (). map Ġ{ Ġit . serial Name Ġ}) Ġreturn Ġfalse Ċ Ġ* Ġreturn Ġtrue Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* Ġ[ hashCode ] Ġimplementation Ġshould Ġuse Ġthe Ġsame Ġproperties Ġfor Ġcomputing Ġthe Ġresult . Ċ Ġ* Ċ Ġ* Ġ### ĠUser - defined Ġserial Ġdescriptors Ċ Ġ* ĠThe Ġbest Ġway Ġto Ġdefine Ġa Ġcustom Ġdescriptor Ġis Ġto Ġuse Ġ[ Serial Descriptor ] Ġbuilder Ġfunction , Ġwhere Ċ Ġ* Ġfor Ġeach Ġserial izable Ġproperty Ġcorresponding Ġelement Ġis Ġdeclared . Ċ Ġ* Ċ Ġ* ĠExample : Ċ Ġ* Ġ``` Ċ Ġ* Ġ// ĠClass Ġwith Ġcustom Ġserializer Ġand Ġcustom Ġserial Ġdescriptor Ċ Ġ* Ġclass ĠData ( Ċ Ġ* ĠĠĠĠ Ġval Ġint Field : ĠInt , Ġ// ĠThis Ġfield Ġis Ġignored Ġby Ġcustom Ġserializer Ċ Ġ* ĠĠĠĠ Ġval Ġlong Field : ĠLong , Ġ// ĠThis Ġfield Ġis Ġwritten Ġas Ġlong , Ġbut Ġin Ġserialized Ġform Ġis Ġnamed Ġas Ġ"_ long Field " Ċ Ġ* ĠĠĠĠ Ġval Ġstring List : ĠList < String > Ġ// ĠThis Ġfield Ġis Ġwritten Ġas Ġregular Ġlist Ġof Ġstrings Ċ Ġ* Ġ) Ċ Ġ* Ċ Ġ* Ġ// ĠDescriptor Ġfor Ġsuch Ġclass : Ċ Ġ* ĠSerial Descriptor (" my . package . Data ") Ġ{ Ċ Ġ* ĠĠĠĠ Ġ// Ġint Field Ġis Ġdeli ber ately Ġignored Ġby Ġserializer Ġ-- Ġnot Ġpresent Ġin Ġthe Ġdescriptor Ġas Ġwell Ċ Ġ* ĠĠĠĠ Ġelement < Long >(" _ long Field ") Ġ// Ġlong Field Ġis Ġnamed Ġas Ġ_ long Field Ċ Ġ* ĠĠĠĠ Ġelement (" string Field ", Ġlist Descriptor < String >()) Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠFor Ġa Ġclasses Ġthat Ġare Ġrepresented Ġas Ġa Ġsingle Ġprimitive Ġvalue , Ġ[ Primitive Serial Descriptor ] Ġbuilder Ġfunction Ġcan Ġbe Ġused Ġinstead . Ċ Ġ* Ċ Ġ* Ġ### ĠNot Ġstable Ġfor Ġinheritance Ċ Ġ* Ċ Ġ* Ġ` Serial Descriptor ` Ġinterface Ġis Ġnot Ġstable Ġfor Ġinheritance Ġin Ġ 3 rd Ġparty Ġlibraries , Ġas Ġnew Ġmethods Ċ Ġ* Ġmight Ġbe Ġadded Ġto Ġthis Ġinterface Ġor Ġcontracts Ġof Ġthe Ġexisting Ġmethods Ġcan Ġbe Ġchanged . Ċ Ġ* ĠThis Ġinterface Ġis Ġsafe Ġto Ġbuild Ġusing Ġ[ build Class Serial Descriptor ] Ġand Ġ[ Primitive Serial Descriptor ], Ċ Ġ* Ġand Ġis Ġsafe Ġto Ġdelegate Ġimplementation Ġto Ġexisting Ġinstances . Ċ Ġ*/ Ċ public Ġinterface ĠSerial Descriptor Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSerial Ġname Ġof Ġthe Ġdescriptor Ġthat Ġidentifies Ġpair Ġof Ġthe Ġassociated Ġserializer Ġand Ġtarget Ġclass . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġgenerated Ġserializers , Ġserial Ġname Ġis Ġequal Ġto Ġthe Ġcorresponding Ġclass 's Ġfully - qualified Ġname ĊĠĠĠĠ Ġ* Ġor , Ġif Ġoverridden , Ġ[ Serial Name ]. ĊĠĠĠĠ Ġ* ĠCustom Ġserializers Ġshould Ġprovide Ġa Ġunique Ġserial Ġname Ġthat Ġidentify Ġboth Ġthe Ġserial izable Ġclass Ġand ĊĠĠĠĠ Ġ* Ġthe Ġserializer Ġitself , Ġignoring Ġtype Ġarguments , Ġif Ġthey Ġare Ġpresent . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Serialization Api ĊĠĠĠ Ġpublic Ġval Ġserial Name : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġkind Ġof Ġthe Ġserialized Ġform Ġthat Ġdetermines Ġ** the Ġshape ** Ġof Ġthe Ġserialized Ġdata . ĊĠĠĠĠ Ġ* ĠForm ats Ġuse Ġserial Ġkind Ġto Ġadd Ġand Ġparse Ġserializer - agnostic Ġmetadata Ġto Ġthe Ġresult . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġexample , ĠJSON Ġformat Ġwraps Ġ[ classes ][ Structure Kind . CLASS ] Ġand Ġ[ Structure Kind . MAP ] Ġinto ĊĠĠĠĠ Ġ* Ġbrackets , Ġwhile ĠProto Buf Ġjust Ġserialize Ġthese Ġtypes Ġin Ġseparate Ġways . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠKind Ġshould Ġbe Ġconsistent Ġwith Ġthe Ġimplementation , Ġfor Ġexample , Ġif Ġit Ġis Ġa Ġ[ primitive ][ Primitive Kind ], ĊĠĠĠĠ Ġ* Ġthen Ġits Ġelements Ġcount Ġshould Ġbe Ġzero Ġand Ġvice Ġvers a . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Serialization Api ĊĠĠĠ Ġpublic Ġval Ġkind : ĠSerial Kind ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġthe Ġdescriptor Ġdescribes Ġnullable Ġelement . ĊĠĠĠĠ Ġ* ĠReturns Ġ` true ` Ġif Ġassociated Ġserializer Ġcan Ġserialize / deserialize Ġnullable Ġelements Ġof Ġthe Ġdescribed Ġtype . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Serialization Api ĊĠĠĠ Ġpublic Ġval Ġis Nullable : ĠBoolean Ġget () Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġnumber Ġof Ġelements Ġthis Ġdescriptor Ġdescribes , Ġbes ides Ġfrom Ġthe Ġclass Ġitself . ĊĠĠĠĠ Ġ* Ġ[ elements Count ] Ġdescribes Ġthe Ġnumber Ġof Ġ** semantic ** Ġelements , Ġnot Ġthe Ġnumber ĊĠĠĠĠ Ġ* Ġof Ġactual Ġfields / properties Ġin Ġthe Ġserialized Ġform , Ġeven Ġthough Ġthey Ġfrequently Ġmatch . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠFor Ġexample , Ġfor Ġthe Ġfollowing Ġclass ĊĠĠĠĠ Ġ* Ġ` class ĠComplex ( val Ġreal : ĠLong , Ġval Ġimag inary : ĠLong )` Ġthe Ġcorresponding Ġdescriptor ĊĠĠĠĠ Ġ* Ġand Ġthe Ġserialized Ġform Ġboth Ġhave Ġtwo Ġelements , Ġwhile Ġfor Ġ` class ĠInt List Ġ: ĠArrayList < Int > ()` ĊĠĠĠĠ Ġ* Ġthe Ġcorresponding Ġdescriptor Ġhas Ġa Ġsingle Ġelement Ġ(` Int Descriptor `, Ġthe Ġtype Ġof Ġlist Ġelement ), ĊĠĠĠĠ Ġ* Ġbut Ġfrom Ġzero Ġup Ġto Ġ` Int . MAX _ VALUE ` Ġvalues Ġin Ġthe Ġserialized Ġform . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Serialization Api ĊĠĠĠ Ġpublic Ġval Ġelements Count : ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġserial Ġannotations Ġof Ġthe Ġassociated Ġclass . ĊĠĠĠĠ Ġ* ĠSerial Ġannotations Ġcan Ġbe Ġused Ġto Ġspecify Ġan Ġadditional Ġmetadata Ġthat Ġmay Ġbe Ġused Ġduring Ġserialization . ĊĠĠĠĠ Ġ* ĠOnly Ġannotations Ġmarked Ġwith Ġ[ Serial Info ] Ġare Ġadded Ġto Ġthe Ġresulting Ġlist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Serialization Api ĊĠĠĠ Ġpublic Ġval Ġannotations : ĠList < Annotation > Ġget () Ġ= Ġempty List () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġpositional Ġname Ġof Ġthe Ġchild Ġat Ġthe Ġgiven Ġ[ index ]. ĊĠĠĠĠ Ġ* ĠPosition al Ġname Ġrepresents Ġa Ġcorresponding Ġproperty Ġname Ġin Ġthe Ġclass , Ġassociated Ġwith ĊĠĠĠĠ Ġ* Ġthe Ġcurrent Ġdescriptor . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIndex OutOfBoundsException Ġfor Ġan Ġillegal Ġ[ index ] Ġvalues . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġthe Ġcurrent Ġdescriptor Ġdoes Ġnot Ġsupport Ġchildren Ġelements Ġ( e . g . Ġis Ġa Ġprimitive ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Serialization Api ĊĠĠĠ Ġpublic Ġfun Ġget ElementName ( index : ĠInt ): ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġan Ġindex Ġin Ġthe Ġchildren Ġlist Ġof Ġthe Ġgiven Ġelement Ġby Ġits Ġname Ġor Ġ[ Composite Decoder . UNKNOWN _ NAME ] ĊĠĠĠĠ Ġ* Ġif Ġthere Ġis Ġno Ġsuch Ġelement . ĊĠĠĠĠ Ġ* ĠThe Ġresulting Ġindex , Ġif Ġit Ġis Ġnot Ġ[ Composite Decoder . UNKNOWN _ NAME ], Ġis Ġguaranteed Ġto Ġbe Ġusable Ġwith Ġ[ getElement Name ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Serialization Api ĊĠĠĠ Ġpublic Ġfun Ġget Element Index ( name : ĠString ): ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġserial Ġannotations Ġof Ġthe Ġchild Ġelement Ġat Ġthe Ġgiven Ġ[ index ]. ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġdiffers Ġfrom Ġ` getElement Descriptor ( index ). annotations ` Ġby Ġreporting Ġonly ĊĠĠĠĠ Ġ* Ġdeclaration - specific Ġannotations : ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* Ġ@ Serializable ĊĠĠĠĠ Ġ* Ġ@ Some Serial Annotation ĊĠĠĠĠ Ġ* Ġclass ĠNested (...) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ Serializable ĊĠĠĠĠ Ġ* Ġclass ĠO uter (@ Another Serial Annotation Ġval Ġnested : ĠNested ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġouter Descriptor . getElement Annotations ( 0 ) Ġ// ĠReturns Ġ[@ Some Serial Annotation ] ĊĠĠĠĠ Ġ* Ġouter Descriptor . getElement Descriptor ( 0 ). annotations Ġ// ĠReturns Ġ[@ Another Serial Annotation ] ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĠOnly Ġannotations Ġmarked Ġwith Ġ[ Serial Info ] Ġare Ġadded Ġto Ġthe Ġresulting Ġlist . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIndex OutOfBoundsException Ġfor Ġan Ġillegal Ġ[ index ] Ġvalues . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġthe Ġcurrent Ġdescriptor Ġdoes Ġnot Ġsupport Ġchildren Ġelements Ġ( e . g . Ġis Ġa Ġprimitive ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Serialization Api ĊĠĠĠ Ġpublic Ġfun Ġget Element Annotations ( index : ĠInt ): ĠList < Annotation > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieves Ġthe Ġdescriptor Ġof Ġthe Ġchild Ġelement Ġfor Ġthe Ġgiven Ġ[ index ]. ĊĠĠĠĠ Ġ* ĠFor Ġthe Ġproperty Ġof Ġtype Ġ` T ` Ġon Ġthe Ġposition Ġ` i `, Ġ` getElement Descriptor ( i )` Ġyields Ġthe Ġsame Ġresult ĊĠĠĠĠ Ġ* Ġas Ġfor Ġ` T . serializer (). descriptor `, Ġif Ġthe Ġserializer Ġfor Ġthis Ġproperty Ġis Ġnot Ġexplicitly Ġoverridden ĊĠĠĠĠ Ġ* Ġwith Ġ`@ Serializable ( with Ġ= Ġ... `) `, Ġ[ Pol ymorphic ] Ġor Ġ[ Context ual ]. ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġcan Ġbe Ġused Ġto Ġcompletely Ġint rospect Ġthe Ġtype Ġthat Ġthe Ġcurrent Ġdescriptor Ġdescribes . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIndex OutOfBoundsException Ġfor Ġillegal Ġ[ index ] Ġvalues . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġthe Ġcurrent Ġdescriptor Ġdoes Ġnot Ġsupport Ġchildren Ġelements Ġ( e . g . Ġis Ġa Ġprimitive ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Serialization Api ĊĠĠĠ Ġpublic Ġfun Ġget Element Descriptor ( index : ĠInt ): ĠSerial Descriptor ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġthe Ġelement Ġat Ġthe Ġgiven Ġ[ index ] Ġis Ġoptional Ġ( can Ġbe Ġabsent Ġis Ġserialized Ġform ). ĊĠĠĠĠ Ġ* ĠFor Ġgenerated Ġdescriptors , Ġall Ġelements Ġthat Ġhave Ġa Ġcorresponding Ġdefault Ġparameter Ġvalue Ġare ĊĠĠĠĠ Ġ* Ġmarked Ġas Ġoptional . ĠCustom Ġserializers Ġcan Ġtreat Ġoptional Ġvalues Ġin Ġa Ġserialization - specific Ġmanner ĊĠĠĠĠ Ġ* Ġwithout Ġdefault Ġparameters Ġconstraint . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠExample Ġof Ġoptional ity : ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* Ġ@ Serializable ĊĠĠĠĠ Ġ* Ġclass ĠH older ( ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġa : ĠInt , Ġ// ĠOptional Ġ== Ġfalse ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġb : ĠInt ?, Ġ// ĠOptional Ġ== Ġfalse ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġc : ĠInt ? Ġ= Ġnull , Ġ// ĠOptional Ġ== Ġtrue ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġd : ĠList < Int >, Ġ// ĠOptional Ġ== Ġfalse ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġval Ġe : ĠList < Int > Ġ= ĠlistOf ( 1 ), Ġ// ĠOptional Ġ== Ġtrue ĊĠĠĠĠ Ġ* Ġ) ĊĠĠĠĠ Ġ* Ġ``` ĊĠĠĠĠ Ġ* ĠReturns Ġ` false ` Ġfor Ġvalid Ġindices Ġof Ġcollections , Ġmaps Ġand Ġenums . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIndex OutOfBoundsException Ġfor Ġan Ġillegal Ġ[ index ] Ġvalues . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġthe Ġcurrent Ġdescriptor Ġdoes Ġnot Ġsupport Ġchildren Ġelements Ġ( e . g . Ġis Ġa Ġprimitive ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Experimental Serialization Api ĊĠĠĠ Ġpublic Ġfun Ġis Element Optional ( index : ĠInt ): ĠBoolean Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġan Ġiterable Ġof Ġall Ġdescriptor Ġ[ elements ][ Serial Descriptor . getElement Descriptor ]. Ċ Ġ*/ Ċ @ Experimental Serialization Api Ċ public Ġval ĠSerial Descriptor . element Descriptors : ĠIterable < Serial Descriptor > ĊĠĠĠ Ġget () Ġ= ĠIterable Ġ{ ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠIterator < Serial Descriptor > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġelements Left Ġ= Ġelements Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ= Ġelements Left Ġ> Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠSerial Descriptor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Element Descriptor ( elements Count Ġ- Ġ( elements Left -- )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠReturns Ġan Ġiterable Ġof Ġall Ġdescriptor Ġ[ element Ġnames ][ Serial Descriptor . getElement Name ]. Ċ Ġ*/ Ċ @ Experimental Serialization Api Ċ public Ġval ĠSerial Descriptor . element Names : ĠIterable < String > ĊĠĠĠ Ġget () Ġ= ĠIterable Ġ{ ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠIterator < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġelements Left Ġ= Ġelements Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Next (): ĠBoolean Ġ= Ġelements Left Ġ> Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnext (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget ElementName ( elements Count Ġ- Ġ( elements Left -- )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ