如何使用protobuf序列化java.util.regex.Pattern?

时间:2019-02-12 12:23:56

标签: java serialization protocol-buffers protobuf-java

我有一个要使用协议缓冲区序列化并存储在Redis中的对象。该对象包含一个java.util.regex.Pattern,在实例化该对象时会对其进行编译。

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

此模式用于验证对特定api的输入。由于每次都编译模式为expensive,因此我在实例化期间编译了一次模式,然后在每次调用api时重用相同的模式实例。如何在以下模式中序列化此可编译Pattern字段,以便在我反序列化对象时可以使用它而无需再次编译该模式?

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

谢谢。

2 个答案:

答案 0 :(得分:0)

我认为这是方钉和圆孔的情况,protobuf和序列化并不能以这种方式使用。

无论如何,似乎您每个API调用都初始化了一个正则表达式。我不知道您的应用如何决定要针对特定​​API使用哪个Regex,但是您必须以Regex字符串开始进行编译。 与其尝试序列化模式,不如将其存储在HashMap<String,Pattern>(正则表达式字符串作为键,并将编译后的模式作为值)中的内存中。然后在需要时获取模式。

答案 1 :(得分:0)

java.util.regex.Pattern本身未实现编码和解码原型功能。但是,您可以自己轻松实现(如Andy Turner所建议的)。像这样:

原始

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序列化对此存在问题。