Skip to content

Serialize optimization #81

@rlalak

Description

@rlalak

I think that issue #80 was not fixed correctly.
Although serialization work on object with unseted field, result still has this field (so the result is bigger than should be).

Example code:

class MyClass
{
  private $first_field;
  private $second_field;

  public function __construct()
  {
    $this->first_field = 'first_field';
    $this->second_field = 'second_field';
  }

  public function preSerialize()
  {
    unset($this->first_field);
  }
}

$t = new MyClass();
var_dump($t);
var_dump((msgpack_pack($t)));
var_dump(msgpack_unpack(msgpack_pack($t)));

$t = new MyClass();
$t->preSerialize();
var_dump($t);
var_dump((msgpack_pack($t)));
var_dump(msgpack_unpack(msgpack_pack($t)));

Output on php 5.4:

object(MyClass)#531 (2) {
  ["first_field":"MyClass":private]=>
  string(11) "first_field"
  ["second_field":"MyClass":private]=>
  string(12) "second_field"
}
string(78) "���MyClass�MyClassfirst_field�first_field�MyClasssecond_field�second_field"
object(MyClass)#540 (2) {
  ["first_field":"MyClass":private]=>
  string(11) "first_field"
  ["second_field":"MyClass":private]=>
  string(12) "second_field"
}
object(MyClass)#540 (1) {
  ["second_field":"MyClass":private]=>
  string(12) "second_field"
}
string(45) "���MyClass�MyClasssecond_field�second_field"
object(MyClass)#531 (2) {
  ["first_field":"MyClass":private]=>
  NULL
  ["second_field":"MyClass":private]=>
  string(12) "second_field"
}

Output on php 7:

object(MyClass)#531 (2) {
  ["first_field":"MyClass":private]=>
  string(11) "first_field"
  ["second_field":"MyClass":private]=>
  string(12) "second_field"
}
string(78) "���MyClass�MyClassfirst_field�first_field�MyClasssecond_field�second_field"
object(MyClass)#540 (2) {
  ["first_field":"MyClass":private]=>
  string(11) "first_field"
  ["second_field":"MyClass":private]=>
  string(12) "second_field"
}
object(MyClass)#540 (1) {
  ["second_field":"MyClass":private]=>
  string(12) "second_field"
}
string(67) "���MyClass�MyClassfirst_field��MyClasssecond_field�second_field"
object(MyClass)#531 (2) {
  ["first_field":"MyClass":private]=>
  NULL
  ["second_field":"MyClass":private]=>
  string(12) "second_field"
}

As you see we have
string(67) "���MyClass�MyClassfirst_field��MyClasssecond_field�second_field"
instead of
string(45) "���MyClass�MyClasssecond_field�second_field"

I think that case for IS_UNDEF (9e619ca#diff-cfd2debe4e667d707f9dd3812bcc1a8aR457) should be different than case for IS_NULL.
It is big difference in sizes.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions