}
case ID_EXTERNALIZABLE_CLASS: {
final Class<?> type = descriptor.getType();
final SerializableClass serializableClass = registry.lookup(type);
final BlockUnmarshaller blockUnmarshaller = getBlockUnmarshaller();
final Externalizable obj;
if (serializableClass.hasObjectInputConstructor()) {
obj = (Externalizable) serializableClass.callObjectInputConstructor(blockUnmarshaller);
} else if (serializableClass.hasPublicNoArgConstructor()) {
obj = (Externalizable) serializableClass.callNoArgConstructor();
} else {
throw new InvalidClassException(type.getName(), "Class is non-public or has no public no-arg constructor");
}
final int idx = instanceCache.size();
instanceCache.add(obj);
obj.readExternal(blockUnmarshaller);
blockUnmarshaller.readToEndBlockData();
blockUnmarshaller.unblock();
final Object resolvedObject = objectResolver.readResolve(serializableClass.hasReadResolve() ? serializableClass.callReadResolve(obj) : obj);
if (unshared) {
instanceCache.set(idx, null);