Example #1
0
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;
}