+ interface SerializedForm extends Externalizable {
+ /**
+ * Return the serial form of this object contents, corresponding to {@link ShardManagerSnapshot#shardList}.
+ *
+ * @return List of shards names.
+ */
+ List<String> shardNames();
+
+ /**
+ * Resolve this proxy to an actual {@link ShardManagerSnapshot}. Implementations can rely on the object to be
+ * set via {@link #resolveTo(ShardManagerSnapshot)}.
+ *
+ * @return A snapshot
+ */
+ Object readResolve();
+
+ /**
+ * Set this proxy to return {@code snapshot} on next {@link #readResolve()}.
+ *
+ * @param newSnapshot Snapshot to set
+ */
+ void resolveTo(@NonNull ShardManagerSnapshot newSnapshot);
+
+ @Override
+ default void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
+ final int size = in.readInt();
+ final var shardList = new ArrayList<String>(size);
+ for (int i = 0; i < size; i++) {
+ shardList.add((String) in.readObject());
+ }
+ resolveTo(new ShardManagerSnapshot(shardList));
+ }
+
+ @Override
+ default void writeExternal(final ObjectOutput out) throws IOException {
+ final var shardList = shardNames();
+ out.writeInt(shardList.size());
+ for (var shardName : shardList) {
+ out.writeObject(shardName);
+ }
+ }
+ }
+
+ private static final class Proxy implements SerializedForm {