http://www.perlmonks.org?node_id=11100464


in reply to How to serialize and deserialize Dios/Object::InsideOut objects?

The following appears to work correctly!

#!/usr/bin/env perl use Data::Dx; use Dios { accessors => 'unified' }; use Storable; use Test::Expr; #use strict; # made redundant by use 5.014_00 #use warnings; # made redundant by use 5.014_00 <== +======= INCORRECT see post below! use 5.014_00; class Nada { has Int $.number is rw; }; class Yada { has Int $.number is rw; has Nada @.nadas is rw; }; # class Yada: sub test_our_yada { my $self=shift; ok $self->isa('Yada'); ok $self->number() == 0; ok @{$self->nadas()} == 2; Dx $self->nadas(); ok $self->nadas()->[0]->number() == 1; ok $self->nadas()->[1]->number() == 2; } { # The "initial" Yada my $yada=Yada->new(number=>0,nadas=>[Nada->new(number=>1),Nada->ne +w(number=>2)]); $yada->main::test_our_yada(); # Serialize $yada and write it to 'Yada.dat' my $dump=$yada->dump(); # NB: Without an argument! store($dump,'Yada.dat'); } { # The restored from 'Yada.dat' Yada object my $dump=retrieve('Yada.dat'); my $yada=Object::InsideOut->pump($dump); $yada->main::test_our_yada(); } done_testing;

Which yields

ok 1 - $self->isa('Yada') ok 2 - $self->number() == 0 ok 3 - @{$self->nadas()} == 2 #line 25 test_03.t $self->nadas() = [ bless(do{\(my $o = 1)}, "Nada"), bless(do{\(my $o = 2)}, "Nada"), ] ok 4 - $self->nadas()->[0]->number() == 1 ok 5 - $self->nadas()->[1]->number() == 2 ok 6 - $self->isa('Yada') ok 7 - $self->number() == 0 ok 8 - @{$self->nadas()} == 2 #line 25 test_03.t $self->nadas() = [ bless(do{\(my $o = 1)}, "Nada"), bless(do{\(my $o = 2)}, "Nada"), ] ok 9 - $self->nadas()->[0]->number() == 1 ok 10 - $self->nadas()->[1]->number() == 2 1..10

Somewhat simpler is

#!/usr/bin/env perl use Data::Dx; use Dios { accessors => 'unified' }; use Storable; use Test::Expr; use 5.014_00; BEGIN { # Must go before the classes are declared! $Nada::storable=1; $Yada::storable=1; } class Nada { has Int $.number is rw; }; class Yada { has Int $.number is rw; has Nada @.nadas is rw; }; # class Yada: # Yeah, I'm lazy sub Yada::test_our_yada { my $self=shift; ok $self->isa('Yada'); ok $self->number() == 0; ok @{$self->nadas()} == 2; Dx $self->nadas(); ok $self->nadas()->[0]->number() == 1; ok $self->nadas()->[1]->number() == 2; } { # The "initial" Yada my $yada=Yada->new(number=>0,nadas=>[Nada->new(number=>1),Nada->ne +w(number=>2)]); $yada->test_our_yada(); # Serialize and write to 'Yada.dat' $yada->store('Yada.dat'); } { # Yada as restored from 'Yada.dat' my $yada=retrieve('Yada.dat'); $yada->test_our_yada(); } done_testing;

Yabba Dabba Doo!

Replies are listed 'Best First'.
Re^2: How to serialize and deserialize Dios/Object::InsideOut objects?
by Athanasius (Bishop) on May 24, 2019 at 14:47 UTC

    Hello clueless newbie,

    Glad you found a solution. I just want to comment on this:

    #use strict; # made redundant by use 5.014_00 #use warnings; # made redundant by use 5.014_00

    The first comment is correct; but the second most certainly is not!

    From use:

    use VERSION also lexically enables all features available in the requested version as defined by the feature pragma, disabling any features not in the requested version's feature bundle.... Similarly, if the specified Perl version is greater than or equal to 5.12.0, strictures are enabled lexically as with use strict.

    (See feature#FEATURE-BUNDLES for a list of the features associated with each Perl version.) The warnings pragma must be enabled explicitly — either via the lexical use warnings;, which is the preferred method; or via a -w command line switch; or by setting the global $^W variable to a true value (not usually recommended).

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      Living up to my username. I stand corrected!

      Thank you!