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 page is 30 bytes long. HTTP::Response=HASH(0x901f110) Not a HASH reference at /usr/local/share/perl/5.10.1/PHP/Serialization.pm line 454.
继续我的序列化/反序列化实验我尝试了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%
%
感谢任何可能的解决方案。
答案 0 :(得分:1)
当你这样做时
my $page = $ua->get($url);
您正在获得HTTP::Response
个对象。您需要调用$response->content
方法来获取响应的内容。
my $response = $ua->get($url);
die "didn't get a page: ".$response->status_line."\n" unless $response->is_success;
my $page = $response->content;
错误消息抱怨PHP :: Serialize不知道如何序列化不是普通的perl HASH / ARRAY ref的东西(在这个例子中可能是CODE引用)。
答案 1 :(得分:0)
HTTP::Response
和/或HTTP::Request
个对象(我记不清哪个)的成员_uri
通常为URI。那个对象是一个受祝福的标量参考。
查看报告错误的行,似乎PHP::Serialization
认为所有对象都是基于散列的。因此,当遇到一个受祝福的标量参考物时,它会发出窒息。
注意:
=head1 TODO
支持不同的对象类型
我不知道能够建议修补程序的序列化格式,但修复程序看起来像:
elsif ( $type eq 'obj' ) {
my $class = ref($val);
$class =~ /(\w+)$/;
my $subclass = $1;
my $reftype = reftype $val;
if ($reftype eq 'HASH') {
# blessed hash serialization
}
elsif ($reftype eq 'ARRAY') {
# blessed array serialization
}
elsif ($reftype eq 'SCALAR') {
# blesssed scalar serialization
}
elsif ($reftype eq 'CODE') {
# blessed coderef serialization
}
elsif ($reftype eq 'GLOB') {
# blessed globref serialization
}
else {
# etc etc
}
其中reftype
来自Scalar::Util。实际上,填写这些分支或将其转换为分派表是有用的,如果只是在遇到不支持的类型时会发出嘎嘎声。