序列化到 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 类型将由以下内容确定

  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() 返回的数组或对象中,这意味着它将覆盖 MongoDB\BSON\Serializable::bsonSerialize() 返回值中的任何 __pclass 键/属性。如果您想避免此行为并设置自己的 __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';

public function
bsonSerialize(): array
{
return [
'foo' => $this->foo, 'prot' => $this->prot];
}
}
// => {"foo": 42, "prot": "wine"}

class AnotherClass2 implements MongoDB\BSON\Serializable
{
public
$foo = 42;

public 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'];

public function
bsonSerialize(): array
{
return
$this->elements;
}
}
// => {"0": "foo", "1": "bar"}

/**
* 嵌套可序列化类
*/

class AnotherClass4 implements MongoDB\BSON\Serializable
{
private
$elements = [0 => 'foo', 2 => 'bar'];

public function
bsonSerialize(): array
{
return
$this->elements;
}
}
// => {"0": "foo", "2": "bar"}

class ContainerClass1 implements MongoDB\BSON\Serializable
{
public
$things;

public function
__construct()
{
$this->things = new AnotherClass4();
}

function
bsonSerialize(): array
{
return [
'things' => $this->things];
}
}
// => {"things": {"0": "foo", "2": "bar"}}


class AnotherClass5 implements MongoDB\BSON\Serializable
{
private
$elements = [0 => 'foo', 2 => 'bar'];

public function
bsonSerialize(): array
{
return
array_values($this->elements);
}
}
// => {"0": "foo", "1": "bar"} 作为根类
["foo", "bar"] 作为 嵌套值

class ContainerClass2 implements MongoDB\BSON\Serializable
{
public
$things;

public function
__construct()
{
$this->things = new AnotherClass5();
}

public function
bsonSerialize(): array
{
return [
'things' => $this->things];
}
}
// => {"things": ["foo", "bar"]}


class AnotherClass6 implements MongoDB\BSON\Serializable
{
private
$elements = ['foo', 'bar'];

function
bsonSerialize(): object
{
return (object)
$this->elements;
}
}
// => {"0": "foo", "1": "bar"}

class ContainerClass3 implements MongoDB\BSON\Serializable
{
public
$things;

public function
__construct()
{
$this->things = new AnotherClass6();
}

public 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';

private
$data;

public function
bsonUnserialize(array $data): void
{
$this->data = $data;
}

public function
bsonSerialize(): array
{
return [
'foo' => $this->foo, 'prot' => $this->prot];
}
}
// => {"foo": 42, "prot": "wine", "__pclass": {"$type": "80", "$binary": "VXBwZXJDbGFzcw=="}}

?>
添加备注

用户贡献备注

此页面没有用户贡献的备注。
To Top