PHP8 MongoDB序列化为BSON系列化

2024-04-08 10:15 更新

阵 列

如果数组是打包数组,即空数组或 键从 0 开始,是连续的,没有间隙:BSON 数组。

如果数组未打包(即具有关联(字符串)键,则 键不从 0 开始,或者当有间隙时:: BSON 对象

顶级(根)文档,始终序列化为 BSON文件。

例子

它们序列化为 BSON 数组:

[ 8, 5, 2, 3 ] => [ 8, 5, 2, 3 ]
[ 0 => 4, 1 => 9 ] => [ 4, 9 ]

这些序列化为 BSON 文档:

[ 0 => 1, 2 => 8, 3 => 12 ] => { "0" : 1, "2" : 8, "3" : 12 }
[ "foo" => 42 ] => { "foo" : 42 }
[ 1 => 9, 0 => 10 ] => { "1" : 9, "0" : 10 }

请注意,这五个示例是完整 文档,并且仅表示 公文。

对象

如果对象属于 stdClass 类,则序列化 作为 BSON 文档。

如果对象是实现 MongoDB\BSON\Type 的受支持类,则使用 BSON 该特定类型的序列化逻辑。MongoDB\BSON\Type 实例(不包括 MongoDB\BSON\Serializable)可能只有 序列化为文档字段值。尝试序列化这样的 对象作为根文档将抛出 MongoDB\Driver\Exception\UnexpectedValueException

如果对象属于实现 MongoDB\BSON\Type 接口的未知类,则抛出 MongoDB\Driver\Exception\UnexpectedValueException

如果对象属于任何其他类,则不实现任何特殊 接口,序列化为BSON文档。仅保留公共属性,忽略受保护的私有属性。

如果对象属于实现 MongoDB\BSON\Serializable 接口的类,请调用 MongoDB\BSON\Serializable::bsonSerialize() 并使用 返回的数组或 stdClass 序列化为 BSON 文档或数组。BSON 类型将由以下因素决定:

  1. 根文档必须序列化为 BSON 公文。
  2. MongoDB\BSON\Persistable 对象必须是 序列化为 BSON 文档。
  3. 如果 MongoDB\BSON\Serializable::bsonSerialize() 返回打包数组,则序列化为 BSON 数组。
  4. 如果 MongoDB\BSON\Serializable::bsonSerialize() 返回非打包数组或 stdClass, 序列化为 BSON 文档。
  5. 如果 MongoDB\BSON\Serializable::bsonSerialize() 未返回数组或 stdClass,则引发 MongoDB\Driver\Exception\UnexpectedValueException 异常。

如果对象属于实现 MongoDB\BSON\Persistable 接口的类( 表示 MongoDB\BSON\Serializable),获取 属性以与前面段落类似的方式,但也添加了一个附加属性__pclass作为二进制值,其中子类型和数据带有完全限定的类名 正在序列化的对象。0x80

将 __pclass 属性添加到数组中,或者 MongoDB\BSON\Serializable::bsonSerialize() 返回的对象,其中 表示它将覆盖任何__pclass键/属性 MongoDB\BSON\Serializable::bsonSerialize() 返回值。如果要避免此行为并设置自己的 __pclass 值,则不能实现 MongoDB\BSON\Persistable 和 应该直接实现 MongoDB\BSON\Serializable

例子

<?php

class stdClass {
  public $foo = 42;
} // => { "foo" : 42 }

class MyClass {
  public $foo = 42;
  protected $prot = "wine";
  private $fpr = "cheese";
} // => { "foo" : 42 }

class AnotherClass1 implements MongoDB\BSON\Serializable {
  public $foo = 42;
  protected $prot = "wine";
  private $fpr = "cheese";
  function bsonSerialize(): array {
      return [ 'foo' => $this->foo, 'prot' => $this->prot ];
  }
} // => { "foo" : 42, "prot" : "wine" }

class AnotherClass2 implements MongoDB\BSON\Serializable {
  public $foo = 42;
  function bsonSerialize(): self {
      return $this;
  }
} // => MongoDB\Driver\Exception\UnexpectedValueException("bsonSerialize() did not return an array or stdClass")

class AnotherClass3 implements MongoDB\BSON\Serializable {
  private $elements = [ 'foo', 'bar' ];
  function bsonSerialize(): array {
      return $this->elements;
  }
} // => { "0" : "foo", "1" : "bar" }

class ContainerClass implements MongoDB\BSON\Serializable {
  public $things = AnotherClass4 implements MongoDB\BSON\Serializable {
    private $elements = [ 0 => 'foo', 2 => 'bar' ];
    function bsonSerialize(): array {
      return $this->elements;
    }
  }
  function bsonSerialize(): array {
      return [ 'things' => $this->things ];
  }
} // => { "things" : { "0" : "foo", "2" : "bar" } }

class ContainerClass implements MongoDB\BSON\Serializable {
  public $things = AnotherClass5 implements MongoDB\BSON\Serializable {
    private $elements = [ 0 => 'foo', 2 => 'bar' ];
    function bsonSerialize(): array {
      return array_values($this->elements);
    }
  }
  function bsonSerialize(): array {
      return [ 'things' => $this->things ];
  }
} // => { "things" : [ "foo", "bar" ] }

class ContainerClass implements MongoDB\BSON\Serializable {
  public $things = AnotherClass6 implements MongoDB\BSON\Serializable {
    private $elements = [ 'foo', 'bar' ];
    function bsonSerialize(): array {
      return (object) $this->elements;
    }
  }
  function bsonSerialize(): array {
      return [ 'things' => $this->things ];
  }
} // => { "things" : { "0" : "foo", "1" : "bar" } }

class UpperClass implements MongoDB\BSON\Persistable {
  public $foo = 42;
  protected $prot = "wine";
  private $fpr = "cheese";
  function bsonSerialize(): array {
      return [ 'foo' => $this->foo, 'prot' => $this->prot ];
  }
} // => { "foo" : 42, "prot" : "wine", "__pclass" : { "$type" : "80", "$binary" : "VXBwZXJDbGFzcw==" } }
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号