自定义序列化

如何配置序列化

Dapr 使用 JSON 序列化,因此发送/接收数据时会丢失(复杂) 类型信息。

序列化(Serialization)

当从控制器返回对象时,将对象传递到DaprClient,或将对象存储在状态存储中,只有公共属性被扫描和序列化。 您可以通过实现\Dapr\Serialization\ISerialize来自定义此行为。 例如,如果您想要创建一个序列化为字符串的 ID 类型,您可以这样做:

  1. <?php
  2. class MyId implements \Dapr\Serialization\Serializers\ISerialize
  3. {
  4. public string $id;
  5. public function serialize(mixed $value,\Dapr\Serialization\ISerializer $serializer): mixed
  6. {
  7. // $value === $this
  8. return $this->id;
  9. }
  10. }

这适用于我们拥有完全所有权的任何类型,但它对库或PHP本身的类不适用。 为此,您需要在 DI 容器中注册一个自定义序列器:

  1. <?php
  2. // in config.php
  3. class SerializeSomeClass implements \Dapr\Serialization\Serializers\ISerialize
  4. {
  5. public function serialize(mixed $value,\Dapr\Serialization\ISerializer $serializer) : mixed
  6. {
  7. // serialize $value and return the result
  8. }
  9. }
  10. return [
  11. 'dapr.serializers.custom' => [SomeClass::class => new SerializeSomeClass()],
  12. ];

反序列化

反序列化的工作方式完全相同,只是接口是 \Dapr\Deserialization\Deserializers\IDeserialize