1

name私はフィールドを持つEmp(クラス)オブジェクトを持っていidます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; 

ここに私の合計コードがあります

従業員クラス:

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

文字列が必要な場所にオブジェクトを単純に格納することはできません。

$oクラスのオブジェクトがEmpあり、このオブジェクトがハッシュを使用して実装されていると仮定すると、そのオブジェクトの文字列化は のようになりますEmp=HASH(0x9bc8880)。この文字列化に含まれる情報では、この文字列からオブジェクトを復元することはできません。

代わりに、オブジェクトを復元できるように、オブジェクトのシリアル化を選択する必要があります。

このData::Dumperモジュールevalは、元の値を再作成するために編集できる Perl コードとしてデータ構造をシリアライズします。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' );

または類似。復元されたオブジェクトのメモリ位置は異なりますが、それ以外は同等であることに注意してください。

データ構造をファイルにシリアル化する場合は、代わりにstoreandを使用できます。retrieveその他の例については、ドキュメントを参照してください。

于 2012-12-27T15:35:35.927 に答える