@@ -68,10 +68,16 @@ static class TypeResolvingAdapter<T> implements TypeDeserializer<T> {
6868 public TypeResolvingAdapter (TypeToken <T > type , TypeResolver <T , ?> typeResolver , BlueNBT blueNBT ) {
6969 this .typeResolver = (TypeResolver <T , Object >) typeResolver ;
7070 this .baseType = this .typeResolver .getBaseType ();
71- this .baseDeserializer = new DefaultAdapter <>(baseType , blueNBT );
71+ this .baseDeserializer = baseType .equals (type ) ?
72+ new DefaultAdapter <>(baseType , blueNBT ) :
73+ blueNBT .getTypeDeserializer (baseType );
7274 this .delegateDeserializers = new HashMap <>();
73- for (TypeToken <? extends T > resolved : typeResolver .getPossibleTypes ())
74- delegateDeserializers .put (resolved , new DefaultAdapter <>(resolved , blueNBT ));
75+ for (TypeToken <? extends T > resolved : typeResolver .getPossibleTypes ()) {
76+ delegateDeserializers .put (resolved , resolved .equals (type ) ?
77+ new DefaultAdapter <>(resolved , blueNBT ) :
78+ blueNBT .getTypeDeserializer (resolved )
79+ );
80+ }
7581 this .fallbackDeserializer = new DefaultAdapter <>(type , blueNBT );
7682 }
7783
@@ -81,20 +87,35 @@ public T read(NBTReader reader) throws IOException {
8187 // read next element as raw data
8288 byte [] data = reader .raw ();
8389
84- // parse data first into base object
85- Object base = baseDeserializer .read (new NBTReader (data ));
90+ try {
91+
92+ // parse data first into base object
93+ Object base = baseDeserializer .read (new NBTReader (data ));
94+
95+ try {
8696
87- // resolve type
88- TypeToken <? extends T > resolvedType = typeResolver .resolve (base );
89- TypeDeserializer <? extends T > deserializer = delegateDeserializers .get (resolvedType );
90- if (deserializer == null ) deserializer = fallbackDeserializer ;
97+ // resolve type
98+ TypeToken <? extends T > resolvedType = typeResolver .resolve (base );
99+ TypeDeserializer <? extends T > deserializer = delegateDeserializers .get (resolvedType );
100+ if (deserializer == null ) deserializer = fallbackDeserializer ;
91101
92- // shortcut if resolved type == base type
93- if (resolvedType .equals (baseType ))
94- return (T ) base ;
102+ // shortcut if resolved type == base type
103+ if (resolvedType .equals (baseType ))
104+ return (T ) base ;
95105
96- // parse data into final type
97- return deserializer .read (new NBTReader (data ));
106+ // parse data into final type
107+ return deserializer .read (new NBTReader (data ));
108+
109+ } catch (IOException ex ) {
110+ return typeResolver .onException (ex , base );
111+ } catch (Exception ex ) {
112+ return typeResolver .onException (new IOException (ex ), base );
113+ }
114+ } catch (IOException ex ) {
115+ return typeResolver .onException (ex );
116+ } catch (Exception ex ) {
117+ return typeResolver .onException (new IOException (ex ));
118+ }
98119 }
99120
100121 }
0 commit comments