private Object read(DataContainer container) throws IOException {
   int sw = container.readInt();
   switch (sw) {
     case DataKind.OBJECT_REF:
       {
         int id = container.readInt();
         Object o1 = idToObject.get(id);
         if (o1 == null) {
           throw new AssertionError();
         }
         return o1;
       }
     case DataKind.OBJECT:
       {
         int id = container.readInt();
         Class<?> clazz = (Class) container.readObject();
         ClassTypeModel<?> typeModel =
             (ClassTypeModel<?>) context.getTypeDomain().getTypeModel(clazz);
         return instantiate(id, container, typeModel);
       }
     case DataKind.CONVERTED_OBJECT:
       {
         Class<?> tclazz = (Class<?>) container.readObject();
         ConvertedTypeModel<?, ?> ctm =
             (ConvertedTypeModel<?, ?>) context.getTypeDomain().getTypeModel(tclazz);
         return convertObject(container, ctm);
       }
     case DataKind.SERIALIZED_OBJECT:
       return container.readObject();
     default:
       throw new StreamCorruptedException("Unrecognized data " + sw);
   }
 }
  private <O> O instantiate(ClassTypeModel<O> typeModel, Map<FieldModel<? super O, ?>, ?> state)
      throws InvalidClassException {
    try {
      ObjectFactory<? super O> factory = context.getFactory(typeModel.getJavaType());

      //
      return factory.create(typeModel.getJavaType(), state);
    } catch (Exception e) {
      InvalidClassException ice =
          new InvalidClassException(
              "Cannot instantiate object from class " + typeModel.getJavaType().getName());
      ice.initCause(e);
      throw ice;
    }
  }