Как сериализовать java.util.regex.Pattern, используя protobuf? - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть объект, который я хочу сериализовать с использованием протокольных буферов и сохранить в redis.Объект содержит java.util.regex.Pattern, который выполняется при создании экземпляра объекта.

public class SerializableEntity {
    private Pattern pattern;
    private List<String> options;
}

Этот шаблон используется для проверки входных данных для определенного API.Поскольку компиляция шаблона каждый раз стоит дорого , я компилирую шаблон один раз во время создания экземпляра, а затем повторно использую один и тот же экземпляр шаблона каждый раз, когда вызывается API.Как сериализовать это поле компиляции Pattern в следующей схеме, чтобы при десериализации объекта я мог использовать его без повторной компиляции шаблона?

 message SerializableEntityProto {
     repeated string option = 1;
     // compiled pattern
 }

Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

java.util.regex.Pattern не имеет встроенных протокодирующих функций кодирования и декодирования.Тем не менее, вы можете реализовать это самостоятельно довольно легко (как предполагает Энди Тернер).Примерно так:

Прото

syntax = "proto2";

package termin4t0r;
option java_package = "com.example.termin4t0r";

// Proto for java.util.regex.Pattern
message RegexPatternProto {
  // See Pattern.pattern()
  optional string pattern = 1;
  // See Pattern.flags()
  optional int64 flags = 2;
}

Java-функции кодирования и декодирования

class RegexpPatternProtos {
  public static RegexPatternProto encode(java.util.regex.Pattern pattern) {
    return RegexPatternProto.newBuilder()
        .setPattern(pattern.pattern())
        .setFlags(pattern.flags())
        .build();
  }

  public static java.util.regex.Pattern decode(RegexPatternProto patternProto) {
    return new RegexPatternProto(
      patternProto.getPattern(), patternProto.getFlags());
  }
}

Я оставляю юнит-тесты как упражнение :) Я даже считаю сериализацию таким способом предпочтительнеепоскольку буферы протокола имеют прямую и обратную совместимость, тогда как у сериализации Java есть проблемы с этим.

0 голосов
/ 12 февраля 2019

Я думаю, что это случай квадратного колышка и круглого отверстия, protobuf и сериализация не должны использоваться таким образом.

В любом случае кажется, что вы инициализируете регулярное выражение при каждом вызове API.Я не знаю, как ваше приложение решает, какой Regex использовать для конкретного API, но вы должны начать со строки Regex для компиляции.Вместо того, чтобы пытаться сериализовать шаблон, сохраните его в памяти в HashMap<String,Pattern> (строка Regex в качестве ключа и скомпилированный шаблон в качестве значения).А затем получите шаблон, когда вам это нужно.

...