package Ġcom . github . ag com . bson . mongodb . utils Ċ Ċ import Ġkotlinx . serialization . K Serializer Ċ import Ġkotlinx . serialization . Pol ymorphic Serializer Ċ import Ġkotlinx . serialization . modules . Serial Module Ċ import Ġkotlinx . serialization . modules . Serial Module Collector Ċ import Ġkotlin . collections . set Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* ĠIter ates Ġon Ġall Ġof Ġthe Ġregistered Ġpol ymorphic Ġserializers . Ċ Ġ* Ċ Ġ* ĠW on 't Ġfail Ġ( returns Ġa Ġnon - null Ġ[ Pol ymorphic Serializer ]) Ġif Ġone Ġof Ġthe Ġbelow Ġconditions Ġhold , Ċ Ġ* Ġ- ĠA Ġserializer Ġfor Ġthe Ġ[ k Class ] Ġis Ġregistered Ġas Ġa Ġsubclass Ġ( safe Ġserializer ) Ċ Ġ* Ġ- Ġ[ k Class ] Ġis Ġregistered Ġas Ġa Ġbase Ġclass Ġ( unsafe Ġserializer ) Ċ Ġ* Ċ Ġ* ĠThe Ġserializer Ġy ielded Ġfrom Ġthe Ġsecond Ġcondition Ġis Ġunsafe , Ġbecause Ġthere Ġis Ġno Ġguarantee Ġthat Ġall Ġsub - classes Ġof Ġ[ k Class ] Ġare Ġpresent . Ċ Ġ* Ġ@ return ĠA Ġ[ Pol ymorphic Serializer ] Ġfor Ġthe Ġ[ k Class ] Ġor Ġnull Ġif Ġno Ġpol ymorphic Ġserializer Ġrelated Ġto Ġthe Ġ[ k Class ] Ġis Ġregistered . Ċ Ġ* Ġ@ param ĠT ĠThe Ġbase Ġclass Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ @ Deprecated ( ĊĠĠĠ Ġmessage Ġ= Ġ" This Ġmethod Ġiter ates Ġover Ġthe Ġwhole Ġcontext Ġevery Ġtime , Ġhence Ġit 's Ġin efficient . ĠUse Ġcaching Ġmechanisms Ġinstead .", ĊĠĠĠ Ġlevel Ġ= ĠDeprec ation Level . HIDDEN Ċ ) Ċ internal Ġfun Ġ< T Ġ: ĠAny > ĠSerial Module . get Pol ymorphic ( k Class : ĠK Class < out ĠT >): ĠPol ymorphic Serializer < T >? Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġbase Clazz : ĠK Class < T > ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġdump To ( object Ġ: ĠSerial Module Collector Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġcontext ual ( k Class : ĠK Class < T >, Ġserializer : ĠK Serializer < T >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< Base Ġ: ĠAny , ĠSub Ġ: ĠBase > Ġpol ymorphic ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Class : ĠK Class < Base >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Class : ĠK Class < Sub >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Serializer : ĠK Serializer < Sub > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( k Class Ġ== Ġactual Class Ġ|| Ġk Class Ġ== Ġbase Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Clazz Ġ= Ġbase Class Ġas ĠK Class < T > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBaseClass Found ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ġcatch Ġ( ex : ĠBaseClass Found ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPol ymorphic Serializer ( base Clazz ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ private Ġobject ĠBaseClass Found Ġ: ĠRuntimeException (" Stop Ġdump ing , Ġalready Ġfound Ġthe Ġneeded Ġbase Ġclass ") Ċ Ċ /** Ċ Ġ* ĠUsed Ġin Ġcaching Ġ[ Serial Module ] Ġpol ymorphic Ġstructure . Ċ Ġ* Ċ Ġ* ĠShould Ġalso Ġinclude Ġthe Ġbase Ġto Ġbase Ġ( key Ġ== Ġone Ġof Ġvalues ) Ġby Ġdefault . Ċ Ġ*/ Ċ internal Ġtype alias ĠSub To Bases Ġ= ĠMap < K Class <* >, ĠSet < K Class <* >>> Ċ Ċ /** Ċ Ġ* ĠUsed Ġin Ġcaching Ġ[ Serial Module ] Ġpol ymorphic Ġstructure . Ċ Ġ* Ċ Ġ* ĠShould Ġalso Ġinclude Ġthe Ġbase Ġto Ġbase Ġ( key Ġ== Ġvalue ) Ġby Ġdefault . Ċ Ġ*/ Ċ internal Ġtype alias ĠSub To Base Ġ= ĠMap < K Class <* >, ĠK Class <* >> Ċ Ċ /** Ċ Ġ* ĠCache Ġa Ġ[ Serial Module ]' s Ġpol ymorphic Ġstructure . Ċ Ġ* Ċ Ġ* ĠBased Ġon Ġthe Ġlogic Ġof Ġthe Ġ[ get Pol ymorphic ] Ġfunction . Ċ Ġ*/ Ċ internal Ġfun Ġdump Pol ym orph ics Structure ( context : ĠSerial Module ): ĠSub To Bases Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < K Class <* >, ĠMutable Set < K Class <* >> >() ĊĠĠĠ Ġcontext . dump To ( object Ġ: ĠSerial Module Collector Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġcontext ual ( k Class : ĠK Class < T >, Ġserializer : ĠK Serializer < T >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġno - op Ġ*/ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< Base Ġ: ĠAny , ĠSub Ġ: ĠBase > Ġpol ymorphic ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Class : ĠK Class < Base >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Class : ĠK Class < Sub >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Serializer : ĠK Serializer < Sub > ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Base ( sub Ġ= Ġactual Class , Ġbase Ġ= Ġbase Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Base ( sub Ġ= Ġbase Class , Ġbase Ġ= Ġbase Class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġ< Base Ġ: ĠAny , ĠSub Ġ: ĠBase > Ġadd Base ( sub : ĠK Class < Sub >, Ġbase : ĠK Class < Base >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbases Ġ= Ġmap [ sub ] Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Set Ġ= Ġmutable Set Of < K Class <* >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ sub ] Ġ= Ġnew Set ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Set ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbases Ġ+= Ġbase ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġreturn Ġmap Ċ }