Any Serializer::deserialize(ITypeMeta* type) { auto flags = type->getFlags(); if (flags & ITypeMeta::IsCustomSerializing) { auto classMeta = static_cast<IClassMeta*>(type); return classMeta->functions["deserialize"]->invoke(this); } else if (flags & ITypeMeta::IsPointer) { lua_pushinteger(L, 1); lua_gettable(L, -2); Any value; if (flags & ITypeMeta::IsPointerToPolymorhic) { value = deserializeUnknownTable(); } else { value = deserialize(type->getPointeeType()); } auto pointer = type->reference(value); value.detach(); // prevent destroy (keep data at heap) lua_pop(L, 1); return pointer; } else if (type == typeMetaOf<std::string>()) { return std::string( lua_tostring(L, -1) ); } else if (flags & ITypeMeta::IsClass) { auto classMeta = static_cast<IClassMeta*>(type); return deserializeAsClass(classMeta); } else if (type == typeMetaOf<int>()) { return lua_tointeger(L, -1); } else if (type == typeMetaOf<float>()) { return (float)lua_tonumber(L, -1); } return Any::empty; }