TTMSFNCObjectPersistence.LoadObjectFromString

Unfortunately the class TMensajeError constructor is not called during the recreation process when reloading the object, therefore, the sub list Items: ArrayOfTItemMensajeError is not created. It actually calls TObject.Create instead. So, you could indeed use the $type recreation process, but then you'll need to change the code, so the Items array is not created in the constructor, but in the getter of the property:

{ TMensajeError }

constructor TMensajeError.Create;
begin
end;

destructor TMensajeError.Destroy;
var
  Item : TItemMensajeError;
begin
  for Item in FItems do
    Item.Free;
  FITems.Free;
  inherited;
end;

function TMensajeError.GetItems: ArrayOfTItemMensajeError;
begin
  if not Assigned(FItems) then
    FItems := ArrayOfTItemMensajeError.Create;

  Result := FItems;
end;

Alternatively, you could implement the same technique as the blog post explains, by implementing the required interfaces on the object to properly create the message and call the correct constructor