in reply to storable $self

$self is probably not a reference to an object, unless you've done something like this:
my $object = Class->new(); my $self = \$object;
That's important, because you're doing nearly everything else right. Without seeing your code, I expect you may be doing something like this:
$object->restore(); sub restore { my $self = shift; $self = restore(); }
Unfortunately, since $self is declared as a lexical in the method and is shifted off of @_, the object is overwritten inside of the method with the restored code without updating the object itself.

Possibly the best way around this is to return the new $self from the method. If you're concerned about interface purity, why not make a deserialization constructor? Another option is to take advantage of Perl's pass by reference semantics, operating directly on $_[0].

sub deserialize { my $class = shift; return $class->restore(); } sub restore_me { $_[0] = $_[0]->restore(); }