package Ġio . v ito . l ud w ie g . types Ċ Ċ import Ġio . v ito . l ud w ie g .* Ċ import Ġio . v ito . l ud w ie g . models . Meta Protocol Byte Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Property 1 Ċ import Ġkotlin . reflect . jvm . is Accessible Ċ Ċ private Ġtype alias ĠK Prop Ġ= ĠK Property 1 < out ĠAny , ĠAny ?> Ċ Ċ class ĠType Struct < T Ġ: ĠAny >( val Ġtype : Ġjava . lang . Class < T >) Ġ: ĠType < Any >() Ġ{ ĊĠĠĠ Ġvar Ġnative Value : ĠT ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġval ĠisEmpty Ġ: ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġnative Value Ġ== Ġnull ĊĊĠĠĠ Ġfun Ġforce Set Native Value ( v : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġnative Value Ġ= Ġv Ġas ĠT ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġencode Value To ( buf : ĠByteArrayOutputStream , Ġcandidate : ĠSerialization Candidate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġnative Value !! ĊĠĠĠĠĠĠĠ Ġval Ġreflect Ġ= Ġtype . kotlin ĊĊĠĠĠĠĠĠĠ Ġif (! isValid Serialization Candidate ( reflect )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Serialization Candidate Exception (" input Ġvalue Ġis Ġnot Ġa Ġvalid Ġserialization Ġcandidate ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġreflect . extract L ud w ie g Fields () ĊĊĠĠĠĠĠĠĠ Ġif (! validate Fields ( fields . keys , Ġtarget )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Serialization Candidate Exception (" input Ġvalue Ġcontains Ġinvalid Ġfields ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinternal Buf Ġ= ĠByteArrayOutputStream ( 0 ) ĊĠĠĠĠĠĠĠ Ġfields . entries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . value . index Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . key . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġit . key . getter . call ( target ) Ġas ĠType < *> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType . encode To ( internal Buf , ĠSerialization Candidate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Ġ= Ġit . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeta Ġ= ĠMeta Protocol Byte ( it . value . type . value ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġv Ġas ? ĠType <* >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Root Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Type Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuf . write Size ( internal Buf . size ()) ĊĠĠĠĠĠĠĠ Ġbuf . write ( internal Buf . toByteArray ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Value ( buf : ĠByteArrayInputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġobjects Ġ= ĠArrayList < Type <* >>() ĊĠĠĠĠĠĠĠ Ġwhile ( buf . available () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeta Ġ= ĠMeta Protocol Byte ( buf . read Byte ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= ĠType . decode With ( buf , Ġmeta ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobjects . add ( v ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcreate Object ( type , Ġobjects ) ĊĠĠĠĠĠĠĠ Ġnative Value Ġ= Ġresult . first ĊĠĠĠĠĠĠĠ Ġde serialization Stats Ġ= Ġresult . second ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠisValid Serialization Candidate ( reflect : ĠK Class <* >) Ġ: ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreflect . annotations . any Ġ{ Ġit Ġis ĠL ud w ie g Package Ġ|| Ġit Ġis ĠSerializable Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvalidate Fields ( fields : ĠSet < K Prop >, Ġinstance : ĠAny ) Ġ: ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfields ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . is Accessible Ġ= Ġtrue ; Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. all Ġ{ Ġit . getter . call ( instance ) Ġis ĠType < *> Ġ} Ċ Ċ } Ċ