/
PingSerializerExampleTest.java
89 lines (74 loc) · 2.43 KB
/
PingSerializerExampleTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
* Copyright (C) 2018-2021 Lightbend Inc. <https://www.lightbend.com>
*/
package jdocs.akka.cluster.typed;
import akka.actor.ExtendedActorSystem;
import akka.actor.typed.ActorRef;
import akka.actor.typed.ActorRefResolver;
import akka.actor.typed.javadsl.Adapter;
import akka.serialization.SerializerWithStringManifest;
import java.nio.charset.StandardCharsets;
public class PingSerializerExampleTest {
public class Pong {}
public class Ping {
public final akka.actor.typed.ActorRef<Pong> replyTo;
public Ping(ActorRef<Pong> replyTo) {
this.replyTo = replyTo;
}
}
// #serializer
public class PingSerializer extends SerializerWithStringManifest {
final ExtendedActorSystem system;
final ActorRefResolver actorRefResolver;
static final String PING_MANIFEST = "a";
static final String PONG_MANIFEST = "b";
PingSerializer(ExtendedActorSystem system) {
this.system = system;
actorRefResolver = ActorRefResolver.get(Adapter.toTyped(system));
}
@Override
public int identifier() {
return 97876;
}
@Override
public String manifest(Object obj) {
if (obj instanceof Ping) return PING_MANIFEST;
else if (obj instanceof Pong) return PONG_MANIFEST;
else
throw new IllegalArgumentException(
"Can't serialize object of type "
+ obj.getClass()
+ " in ["
+ getClass().getName()
+ "]");
}
@Override
public byte[] toBinary(Object obj) {
if (obj instanceof Ping)
return actorRefResolver
.toSerializationFormat(((Ping) obj).replyTo)
.getBytes(StandardCharsets.UTF_8);
else if (obj instanceof Pong) return new byte[0];
else
throw new IllegalArgumentException(
"Can't serialize object of type "
+ obj.getClass()
+ " in ["
+ getClass().getName()
+ "]");
}
@Override
public Object fromBinary(byte[] bytes, String manifest) {
if (PING_MANIFEST.equals(manifest)) {
String str = new String(bytes, StandardCharsets.UTF_8);
ActorRef<Pong> ref = actorRefResolver.resolveActorRef(str);
return new Ping(ref);
} else if (PONG_MANIFEST.equals(manifest)) {
return new Pong();
} else {
throw new IllegalArgumentException("Unable to handle manifest: " + manifest);
}
}
}
// #serializer
}