Dapr SDK中的序列化

    Dapr的SDK为下面两种情况提供序列化: 首先是对于通过请求和响应的有效载荷传递的API对象。 其次,对于要持久化的对象。 对于这两种情况,SDK都提供了默认的序列化实现。 在Java SDK中,由DefaultObjectSerializer这个类提供JSON序列化功能。

    在上面的示例中,应用程序将收到一个对方法的POST请求,请求的有效载荷为"My Message",这句说明中给它添加了引号是因为序列化工具会把输入的String字符串序列化为JSON。

    1. POST /saySomething HTTP/1.1
    2. Host: localhost
    3. Content-Type: text/plain
    4. Content-Length: 12
    5. "My Message"

    状态管理

    1. DaprClient client = (new DaprClientBuilder()).build();
    2. client.saveState("MyStateStore", "MyKey", "My Message").block();

    在这个例子中,My Message将被保存下来。 在这句说明中,没有给数据加上引号是因为Dapr的API会在保存JSON请求对象之前在内部进行解析。

    1. [
    2. {
    3. "key": "MyKey",
    4. "value": "My Message"
    5. ]
    1. client.publishEvent("TopicName", "My Message").block();

    绑定

    在这种情况下,对象也会被序列化为byte[]类型,而输入绑定会按原样接收原始的byte[],并将其反序列化为预期的对象类型。

    • 输出绑定:
    1. DaprClient client = (new DaprClientBuilder()).build();
    2. client.invokeBinding("sample", "My Message").block();
    • 输入绑定:
    1. @PostMapping(path = "/sample")
    2. public void handleInputBinding(@RequestBody(required = false) byte[] body) {
    3. String message = (new DefaultObjectSerializer()).deserialize(body, String.class);
    4. System.out.println(message);
    5. }

    应当会出现如下输出:

    1. My Message

    Actor方法调用的对象序列化和反序列化与服务方法调用相同,唯一不同的是应用程序不需要反序列化请求或序列化响应,因为这一切都由SDK透明地完成。

    • 调用一个Actor的方法:
    1. public static void main() {
    2. ActorProxyBuilder builder = new ActorProxyBuilder("DemoActor");
    3. String result = actor.invokeActorMethod("say", "My Message", String.class).block();
    • 实现一个Actor的方法:

    应当会出现如下输出:

      Actor 状态管理

      Actor也可以有状态。 在这种情况下,状态管理器将使用状态序列化工具对对象进行序列化和反序列化,并对应用程序进行透明处理。

      1. public String actorMethod(String message) {
      2. // Reads a state from key and deserializes it to String.
      3. String previousMessage = super.getActorStateManager().get("lastmessage", String.class).block();
      4. // Sets the new state for the key after serializing it.
      5. super.getActorStateManager().set("lastmessage", message).block();
      6. return previousMessage;
      7. }

      Dapr的默认序列化工具是JSON序列化工具,其期望如下:

      1. 使用基本的JSON数据类型来实现跨语言和跨平台的兼容性:字符串、数字、数组、布尔值、空值和另一个JSON对象。 应用程序的可序列化对象中的每一个复杂的属性类型(例如DateTime),都应该被表示为JSON的基本类型之一。
      2. 用默认序列化工具持久化的数据也应该被保存为JSON对象,不需要额外的引号或编码。 下面的例子显示了一个字符串和一个JSON对象在Redis存储中的样子。
      1. redis-cli MGET "ActorStateIT_StatefulActorService||StatefulActorTest||1581130928192||message
      2. "This is a message to be saved and retrieved."
      1. redis-cli MGET "ActorStateIT_StatefulActorService||StatefulActorTest||1581130928192||mydata
      2. {"value":"My data value."}
      1. 自定义序列化工具必须将对象序列化为byte[]类型。
      2. 自定义序列化工具必须将byte[]反序列化为对象。
      3. 当用户提供一个自定义的序列化工具时,它应该以byte[]的形式被传输或持久化, 持久化时,也应当编码为Base64字符串, 大多数JSON库都能够完成这个功能。
      1. redis-cli MGET "ActorStateIT_StatefulActorService||StatefulActorTest||1581130928192||mydata