public synchronized void deserializeFromFile(final File snapshotName) throws IOException {
    final File snapshotFile = new File(String.valueOf(snapshotName));
    if (!snapshotFile.exists() || !snapshotFile.isFile()) {
      LOGGER.warn(
          "Failed to deserialize from file, file {} does not exist.",
          snapshotFile.getAbsolutePath());
      return;
    }

    queue.clear();
    try (final FileInputStream inputStream = new FileInputStream(snapshotFile)) {
      isClosed.set(ReadWriteIOUtils.readBool(inputStream));
      final QueueSerializerType type =
          QueueSerializerType.deserialize(ReadWriteIOUtils.readByte(inputStream));
      if (serializers.containsKey(type)) {
        serializers
            .get(type)
            .get()
            .loadQueueFromFile(inputStream, queue, this::deserializeFromByteBuffer);
      } else {
        throw new UnsupportedOperationException("Unknown serializer type: " + type.getType());
      }
    }
  }
{@link AbstractSerializableListeningQueue} is the encapsulation of the {@link
ConcurrentIterableLinkedQueue} to enable flushing all the element to disk and reading from it. To
implement this, each element much be configured with its own ser/de method. Besides, this class
also provides a means of opening and closing the queue, and a queue will stay empty while closed.
iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/pipe/datastructure/queue/listening/AbstractSerializableListeningQueue.java