PHP::SerializationはHTTP::Responseをシリアライズしようとするとエラーになります。
例を次に示します。ヒントはありますか?
#!/usr/bin/perl -w
use strict ;
use warnings ;
use LWP ;
use PHP::Serialization qw(serialize unserialize);
my $url = 'http://stackoverflow.com/' ;
my $ua = LWP::UserAgent->new() ;
my $page = $ua->get($url) ;
print "HTML page is ". length($page)." bytes long.\n" ;
print $page ; print "\n" ;
my $buffer ;
eval { $buffer = serialize($page); } ; die $@ if $@ ;
open FH, '>stored.dat' or die "Cannot create store file $!" ;
binmode FH ;
print FH $buffer ;
close FH ;
実行すると、次のようになります。
HTML ページの長さは 30 バイトです。 HTTP::レスポンス=ハッシュ(0x901f110) /usr/local/share/perl/5.10.1/PHP/Serialization.pm 行 454 の HASH 参照ではありません。
シリアライゼーション/デシリアライゼーションの実験をさらに進めて、FreezeThaw
パッケージを試しました。次のスニペットでわかるように、機能しますが、別の問題が発生しました。
再構築された (逆シリアル化された) オブジェクトには型がないため、そのメソッドを使用できません。
それは「非参照」なので、 私も「祝福」することはできません。
この問題にどのようにアプローチすればよいですか?
#!/usr/bin/perl -w
use strict ;
use warnings ;
use HTML::Parser ;
use HTML::Form ;
use HTTP::Response ;
use LWP ;
use FreezeThaw qw(freeze thaw cmpStr safeFreeze cmpStrHard);
my $url = 'http://stackoverflow.com/' ;
my $ua = LWP::UserAgent->new() ;
my $page = $ua->get($url) ;
print "HTML page is ". length($page)." bytes long.\n" ;
print $page ; print "\n" ;
print $page->status_line(), "\n" ;
my $buffer ;
eval { $buffer = freeze($page); } ; die $@ if $@ ;
print "Serdes buffer is ". length($buffer)." bytes long.\n" ;
open FH, '>stored.dat' or die "Cannot create store file $!" ;
binmode FH ;
print FH $buffer ;
close FH ;
my $otherb ;
open FH, '<stored.dat' or die "Cannot open store file $!" ;
binmode FH ;
$otherb = do { local($/); <FH> } ;
close FH ;
print "Serdes buffer is ". length($otherb)." bytes long.\n" ;
my $proto = HTTP::Response->new() ;
my $recpg ;
eval { $recpg = thaw ($otherb); } ; die $@ if $@ ;
print $recpg ;
#bless $recpg, ref($proto)||$proto ;
bless $recpg, "HTTP::Response" ;
print $recpg ;
#print $recpg->status_line(), "\n" ;
実行すると、次のようになります。
% ./serdesLab2.pl
HTML page is 30 bytes long.
HTTP::Response=HASH(0x970ea10)
200 OK
Serdes buffer is 214347 bytes long.
Serdes buffer is 214347 bytes long.
Can't bless non-reference value at ./serdesLab2.pl line 45.
1%
%
可能な解決策をありがとう。