我有一个包含字段name
,id
和password
的Emp(类)对象:
$emp = new Emp({name=>'pavan', id=>101, password=>'05cc11'});
$serializble = freeze($emp);
在会话中存储:
$session->param("emp",$serializble);
但是当我打开存储在tmp目录中的会话对象时,emp值为undef
。
使用Storable序列化对象后更新。
$serializble = freeze($emp);
$session->param("emp",$serializble);
这是会话文件(为了便于阅读,添加了换行符):
$D = {'_SESSION_ID' => 'dd75c6042893334a6bf26794b4ce5c74',
'_SESSION_ATIME' => 1356628765,
'emp' => '^D^G^D1234^D^D^D^H^Q^CPEmp^C^B^@^@^@ ^Epavan^D^@^@^@name^H�^B^@^@^@id',
'_SESSION_REMOTE_ADDR' => '127.0.0.1',
'_SESSION_CTIME' => 1356628765};;$D
当我尝试从会话中返回对象时,它返回undef
:
$recoverable = thaw($session->param('emp');
print $recoverable;
这是我的总代码
Emp class:
package Emp;
sub new{
my ($class, $args) = @_;
my $self = bless{}, $class;
$self->{name} = $args->{name};
$self->{id}=$args->{id};
return $self;
}
sub getEmpname{
my $self = shift;
return $self->{name};
}
1;
emp.cgi
$query = new CGI();
$session = new CGI::Session("driver:File", undef, {Directory => "/tmp"});
$emp = new Emp( { name => $query->param('username'),
id => 101
} );
my $serialized = freeze($emp);
$session->param("emp", $serialized);
$login = $emp->getEmpname(); #it is the method of Emp class
$cookie = $query->cookie( -name => $login,
-value => $session->id,
-expires => '+3M',
);
print $query->header( -type => 'text/html',
-cookie => $cookie,
);
welcome.cgi
$q = new CGI();
$sid = $q->cookie('login') || $q->param('login') || undef;
$session = new CGI::Session(undef, $sid, {Directory=>'/tmp'});
print $q->header('text/html');
print $q->start_html('title');
print "<br>";
print Dumper $session->param('emp');
my $emp = thaw( $session->param('emp') ); //which is saved in session object.
print $emp->getEmpname();
print end_html;
答案 0 :(得分:4)
您不能简单地存储一个符合预期字符串的对象。
如果我们有一个类$o
的对象Emp
,并假设该对象是使用哈希实现的,那么该对象的 stringification 将类似于{{ 1}}。此字符串化中包含的信息不允许从该字符串中恢复对象。
相反,您必须选择对象的序列化,以便可以恢复对象。
Data::Dumper
module将数据结构序列化为Perl代码,可以Emp=HASH(0x9bc8880)
来重新创建原始值。 Storable
module以二进制格式存储数据,可能适用于此处。
您可以通过eval
序列化数据结构(或对象),并通过freeze
进行恢复。
thaw
输出:
use strict; use warnings; use Storable qw(freeze thaw); use Data::Dumper;
my $o = bless {a => 1, b => 2}, 'Emp';
print "> Dumper representation of original ($o)\n";
print Dumper $o;
print "> serializing the object...\n";
my $serialized = freeze($o);
print "> restoring the object...\n";
my $restored = thaw($serialized);
print "> Dumper representation of copy ($restored)\n";
print Dumper $restored;
或类似的。请注意,还原的对象具有不同的内存位置,但在其他情况下是等效的。
如果要将数据结构序列化为文件,可以使用> Dumper representation of original (Emp=HASH(0x8de78c8))
$VAR1 = bless( {
'a' => 1,
'b' => 2
}, 'Emp' );
> serializing the object...
> restoring the object...
> Dumper representation of copy (Emp=HASH(0x8f5df64))
$VAR1 = bless( {
'a' => 1,
'b' => 2
}, 'Emp' );
和store
代替;请参阅文档以获取更多示例。