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

clueless newbie has asked for the wisdom of the Perl Monks concerning the following question:

Ave!

I'm struggling with serializing and deserializing Dios/Object::InsideOut objects. So far as I can tell Dios makes use of Object::InsideOut and Object::InsideOut provides $object->dump() and Object::InsideOut->pump() for serialization/deserialization. On an object that does NOT contain another object I've been able to get it to work but when the object contains other objects as in the code below nothing I've tried works?

#!/usr/bin/env perl use Data::Dumper; use Data::Dx; use Dios { accessors => 'unified' }; use Getopt::Long; use Path::Tiny; use Test::Expr; 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: BEGIN { # Let's confirm that Dios uses Object::InsideOut so we can "dump" +and "pump" say $INC{'Object/InsideOut.pm'}; }; Getopt::Long::GetOptions( "initialize" => \my $initialize, "restore" => \my $restore, "save" => \my $save, ); say "<co de>"; Nada->new(), Yada->new(), say "initialized!" if ($initialize); 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; } if ($save) { # The "initial" Yada my $yada=Yada->new(number=>0,nadas=>[Nada->new(number=>1),Nada->ne +w(number=>2)]); $yada->main::test_our_yada(); # $erialized and written to 'Yada.dat' Path::Tiny::path('Yada.dat')->spew_raw($yada->dump(1)); done_testing; } elsif ($restore) { # The restored from 'Yada.dat' Yada my $yada=Object::InsideOut->pump(Path::Tiny::path('Yada.dat')->slu +rp_raw()); $yada->main::test_our_yada(); done_testing; } else { warn "Needs a 'save' or a 'restore'."; } say "</co de>"; __END__
My results can be seen
# Saved WITHOUT initial "Nada->new(), Yada->new()" >perl test_01.t -save ok 1 - $self->isa('Yada') ok 2 - $self->number() == 0 ok 3 - @{$self->nadas()} == 2 #line 38 test_01.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 1..5 # Restored WITHOUT initial "Nada->new(), Yada->new()" >perl test_01.t -restore OIO::Args error: Unknown field name for class 'Yada': number Package: main File: test_01.t Line: 52 Trace begun at test_01.t line 52 # Restored WITH initial "Nada->new(), Yada->new()" >perl test_01.t -initialize -restore initialized! ok 1 - $self->isa('Yada') ok 2 - $self->number() == 0 ok 3 - @{$self->nadas()} == 2 #line 38 test_01.t $self->nadas() = [ bless(do{\(my $o = 1)}, "Nada"), bless(do{\(my $o = 2)}, "Nada"), ] not ok 4 - $self->nadas()->[0]->number() == 1 # Failed test '$self->nadas()->[0]->number() == 1' # at test_01.t line 45. # # (do{$self->nadas()->[0]->number() == 1}) was false # because: # $self --> bless(do{\(my $o = 1)}, "Yada") # not ok 5 - $self->nadas()->[1]->number() == 2 # Failed test '$self->nadas()->[1]->number() == 2' # at test_01.t line 46. # # (do{$self->nadas()->[1]->number() == 2}) was false # because: # $self --> bless(do{\(my $o = 1)}, "Yada") # 1..5 ERROR: Duplicate reclaimed object ID (1) in class tree for Nada in thr +ead 0 # Looks like you failed 2 tests of 5. # Saved WITH initial "Nada->new(), Yada->new()" >perl test_01.t -initialize -save initialized! ok 1 - $self->isa('Yada') ok 2 - $self->number() == 0 ok 3 - @{$self->nadas()} == 2 #line 38 test_01.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 1..5 # Restored WITHOUT initial "Nada->new(), Yada->new()" >perl test_01.t -restore OIO::Args error: Unknown field name for class 'Yada': number Package: main File: test_01.t Line: 52 Trace begun at test_01.t line 52 # Restored WITH initial "Nada->new(), Yada->new()" >perl test_01.t -initialize -restore initialized! ok 1 - $self->isa('Yada') ok 2 - $self->number() == 0 ok 3 - @{$self->nadas()} == 2 #line 38 test_01.t $self->nadas() = [ bless(do{\(my $o = 1)}, "Nada"), bless(do{\(my $o = 2)}, "Nada"), ] not ok 4 - $self->nadas()->[0]->number() == 1 # Failed test '$self->nadas()->[0]->number() == 1' # at test_01.t line 45. # # (do{$self->nadas()->[0]->number() == 1}) was false # because: # $self --> bless(do{\(my $o = 1)}, "Yada") # not ok 5 - $self->nadas()->[1]->number() == 2 # Failed test '$self->nadas()->[1]->number() == 2' # at test_01.t line 46. # # (do{$self->nadas()->[1]->number() == 2}) was false # because: # $self --> bless(do{\(my $o = 1)}, "Yada") # 1..5 ERROR: Duplicate reclaimed object ID (1) in class tree for Nada in thr +ead 0 # Looks like you failed 2 tests of 5.

What am I doing wrong - and how do I fix it?