Приветствую.

Столкнулся со странным поведением JSON::XS (3.01).

Пытаюсь сериализовать объект, содержащий объекты, используя функцию FREEZE. 
Один из объектов содержит большое число аргументов (61 пара ключ-значение). При 
сериализации такого объекта скрипт падает с ошибкой "Segmentation fault" или 
метод encode() возвращает undef.

Иногда скрипт работает корректно. В этом случае незначительное увеличение 
кол-ва аргументов или уровня вложенности объектов снова приводит к выше 
описанному результату.

Пример:

#!/usr/bin/env perl

use 5.010000;
use strict;
use warnings;

use JSON::XS;

my $json_szr = JSON::XS->new();
$json_szr->allow_tags( 1 );

my @foo_params;
for ( 1 .. 61 ) {
  push ( @foo_params, "coo$_" => 1 );
}
my $foo1 = Foo->new( @foo_params );
my $foo2 = Foo->new( @foo_params );

my $bar1 = Bar->new(
  foo => $foo1,
);

my $bar2 = Bar->new(
  foo => $foo2,
  bar => $bar1
);

my $bar_json = $json_szr->encode( $bar2 );
if ( defined $bar_json ) {
  say $bar_json;
}


package Foo;

####
sub new {
  my $class = shift;
  my %params = @_;
 
  return bless \%params, $class;
}

####
sub FREEZE {
  my $self = shift;
  
  return %{$self};
}

####
sub THAW {
  my $class = shift;
  my $szr   = shift;

  return $class->new( @_ );
}


package Bar;

# Аналогично Foo
…

С уважением
Евгений Понизовский

-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить