1

我有一个带有字段的 Emp(类)对象nameid并且password

$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类:

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,
                    );

欢迎.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;
4

1 回答 1

4

您不能简单地将对象存储在需要字符串的位置。

如果我们有一个$oclass的对象Emp,并假设该对象是使用哈希实现的,那么该对象的字符串化将类似于Emp=HASH(0x9bc8880). 此字符串化中包含的信息不允许从该字符串中恢复对象。

相反,您必须选择对象的序列化,以便您可以恢复对象。

Data::Dumper模块将数据结构序列化为 Perl 代码,可以对其进行eval编辑以重新创建原始值。该Storable模块以二进制格式存储数据,可能适用于此。

您可以通过 序列化数据结构(或对象)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' );

或类似的。请注意,恢复的对象具有不同的内存位置,但在其他方面是等效的。

如果要将数据结构序列化为文件,可以使用storeandretrieve代替;有关更多示例,请参阅文档。

于 2012-12-27T15:35:35.927 回答