note 125263 added to function.serialize
| From: | Rohan@php.net | Date: | Thu, 13 Aug 2020 09:40:00 +0000 |
| Subject: | note 125263 added to function.serialize | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-214954@lists.php.net to get a copy of this message | ||
I have also written some code for importing serialized PHP data into PERL and then writing it back
into PHP. I think the similar library posted above is actually more robust for a few select cases,
but mine is more compact and a little easier to follow. I'd really like comments if anyone
finds this useful or has improvements. Please credit me if you use my code.
sub unserialize {
my($raw) = $_[0];
my(@rawList, $type, $len, $body);
# Split raw data into fields
@rawList = split(/:/, $raw, 3);
# Get datatype field
$type = $rawList[0];
# Basically a switch operation on datatype possibilities
if ($type eq 'N;') {
# ... NULL datatype
return 0;
} elsif ($type eq 'i' or $type eq 'd' or $type eq 'b') {
# ... Integer, Float and Boolean datatypes
$body = $rawList[1];
chomp($body);
return substr($body, 0, -1);
} elsif ($type eq 's') {
# ... String datatype
$len = $rawList[1];
$body = $rawList[2];
chomp($body);
return substr($body, 1, $len);
} elsif ($type eq 'a') {
# ... Use a recursive solution for Arrays
my ($keyMatch, $valMatch, %assoc);
$keyMatch = 'i:\d+;|s:\d+:".*?";';
$valMatch = 'N;|b:[01];|i:\d+;|d:\d+.\d+;|s:\d+:".*?";|a:\d+:{.*?}';
$len = $rawList[1];
$body = $rawList[2];
chomp($body);
$body = substr($body, 1, -1);
while ($body =~ /^($keyMatch)($valMatch)($keyMatch|$)(.*)/ogs) {
$assoc{unserialize($1)} = unserialize($2);
$body = $3 . $4;
}
# Return reference to hash; allows multi-layer arrays
return \%assoc;
} elsif ($type eq 'O') {
# ... Use a recursive solution for Objects
my ($obj, @objList, $className, $objLen, $objBody, $objAssoc);
my %object;
$obj = $rawList[2];
@objList = split(/:/, $obj, 3);
$className = substr($objList[0], 1, -1);
$objLen = $objList[1];
$objBody = $objList[2];
# A little hacky; plunders the Array unserialize logic.
$objAssoc = unserialize("a:$objLen:$objBody");
# We must distinguish Objects from Arrays in the internal PERL
# representation. We do this by using an undef hash key
# 'OBJECT'. No PHP array should return an undef hash key.
# Therefore the test exists($hash{'OBJECT'}) combined with
# not(defined($hash{'OBJECT'})) should work to determine if
# the hash returned is an array or an object.
$object{'OBJECT'} = undef;
$object{'name'} = $className;
$object{'len'} = $objLen;
$object{'assoc'} = $objAssoc;
return \%object;
}
}
# serialize()
# Takes a PERL scalar or properly formed (i.e. generated by unserialize() or
# organized accordingly) referenced hash and converts it into a PHP format
# serialized data string. Uses recursive algorithms for arrays and objects.
sub serialize {
my($input) = $_[0];
if ($input =~ /^\d+$/) {
# ... Integer datatype
return "i:$input;";
} elsif ($input =~ /^\d+\.\d+$/) {
# ... Float datatype
return "d:$input;";
} elsif (ref($input) eq 'HASH') {
# ... Object and Array datatypes.
# See serialize() above for explanation of the test used here to
# distinguish Object from Array.
if (exists(${$input}{'OBJECT'}) and
not defined(${$input}{'OBJECT'})) {
# ... Use a recursive solution for Objects
my($className, $objLen, $objAssoc);
$className = ${$input}{'name'};
$objLen = ${$input}{'len'};
# A little hacky; plunders the Array serialize logic
$objAssoc = substr(serialize(${$input}{'assoc'}), 4);
return "O:3:\"$className\":$objLen:$objAssoc";
} else {
# ... Use a recursive solution for Arrays
my($key, $value, $serKey, $serVal, $hashLen);
my($serHash) = '';
while (($key, $value) = each(%{$input})) {
$serKey = serialize($key);
$serVal = serialize($value);
$serHash = $serHash . $serKey . $serVal;
}
$hashLen = scalar(keys(%{$input}));
return "a:$hashLen:{$serHash}";
}
} else {
# ... String datatype
my $len = length($input);
return "s:$len:\"$input\";";
}
}
If you have any problem then you can contact me by going here:
https://www.darkhackerworld.com/p/contact-me.html
----
Server IP: 45.112.84.4
Probable Submitter: 195.138.250.34 (proxied: 2402:8100:22bd:3d97:7c62:b861:50d8:8e26)
----
Manual Page -- http://php.net/manual/en/function.serialize.php
Edit -- https://master.php.net/note/edit/125263
Del: integrated -- https://master.php.net/note/delete/125263/integrated
Del: useless -- https://master.php.net/note/delete/125263/useless
Del: bad code -- https://master.php.net/note/delete/125263/bad+code
Del: spam -- https://master.php.net/note/delete/125263/spam
Del: non-english -- https://master.php.net/note/delete/125263/non-english
Del: in docs -- https://master.php.net/note/delete/125263/in+docs
Del: other reasons-- https://master.php.net/note/delete/125263
Reject -- https://master.php.net/note/reject/125263
Search -- https://master.php.net/manage/user-notes.php