package Ġorg . c ata fr at ta . str uk t . runtime . impl Ċ Ċ import Ġorg . c ata fr at ta . str uk t . common . Codec Naming Strategy Ċ import Ġorg . c ata fr at ta . str uk t . runtime . Binary Sink Ċ import Ġorg . c ata fr at ta . str uk t . runtime . Binary Source Ċ import Ġorg . c ata fr at ta . str uk t . runtime . Codec Ċ import Ġorg . c ata fr at ta . str uk t . runtime . Str uk t Ċ import Ġkotlin . reflect . K Class Ċ Ċ internal Ġclass ĠDefault Str uk t ( ĊĠĠĠ Ġprivate Ġval Ġclass Loader : ĠClassLoader Ċ ) Ġ: ĠStr uk t Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcodecs Ġ= Ġmutable Map Of < K Class <* >, ĠCodec <* >>() ĊĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġread ( klass : ĠK Class < T >, Ġsource : ĠBinary Source ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Codec ( klass ). read ( source ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny > Ġwrite ( value : ĠT , Ġsink : ĠBinary Sink ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Codec ( value :: class ). write ( value , Ġsink ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > Ġfind Codec ( klass : ĠK Class < out ĠT >): ĠCodec < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcodecs . get Or Put ( klass ) Ġ{ Ġload Codec ( klass ) Ġ} Ġas ĠCodec < T > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO ( design ): ĠShould Ġthis Ġbe Ġthread - safe ? ĊĠĠĠ Ġprivate Ġfun Ġload Codec ( klass : ĠK Class < *> ): ĠCodec < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġclass Loader . load Class ( Codec Naming Strategy . fullName For ( klass )) ĊĠĠĠĠĠĠĠ Ġval Ġctor Ġ= Ġclazz . getDeclared Constructor ( Str uk t :: class . java ) ĊĠĠĠĠĠĠĠ Ġctor . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= Ġctor . newInstance ( this ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinstance Ġas ĠCodec < *> ĊĠĠĠ Ġ} Ċ } Ċ