PHP8 MongoDB序列化为BSON系列化
阵 列
如果数组是打包数组,即空数组或 键从 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 类型将由以下因素决定:
- 根文档必须序列化为 BSON 公文。
- MongoDB\BSON\Persistable 对象必须是 序列化为 BSON 文档。
- 如果 MongoDB\BSON\Serializable::bsonSerialize() 返回打包数组,则序列化为 BSON 数组。
- 如果 MongoDB\BSON\Serializable::bsonSerialize() 返回非打包数组或 stdClass, 序列化为 BSON 文档。
- 如果 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==" } }