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

如何使用protobuf序列化java.util.regex.Pattern?,java,serialization,protocol-buffers,protobuf-java,Java,Serialization,Protocol Buffers,Protobuf Java,我有一个对象,我想使用协议缓冲区序列化并存储在redis中。该对象包含一个java.util.regex.Pattern,该模式在实例化该对象时遵循 public class SerializableEntity { private Pattern pattern; private List<String> options; } 谢谢。我认为这是一个方钉圆孔的例子,protobuf和serialization不应该这样使用 不管怎样,似乎每次API调用都会初始化一个

我有一个对象,我想使用协议缓冲区序列化并存储在redis中。该对象包含一个
java.util.regex.Pattern
,该模式在实例化该对象时遵循

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

谢谢。

我认为这是一个方钉圆孔的例子,protobuf和serialization不应该这样使用

不管怎样,似乎每次API调用都会初始化一个正则表达式。我不知道你的应用程序是如何决定对特定API使用哪个正则表达式的,但你必须从一个正则表达式字符串开始编译。
与其尝试序列化模式,不如将其存储在内存中的
HashMap
(Regex字符串作为键,编译后的模式作为值)。然后在需要时获取模式。

java.util.regex.pattern本身没有实现编码和解码原型函数。然而,您可以很容易地实现这一点(正如Andy Turner所建议的)。大概是这样的:

原型

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());
  }
}

我把unittests留作练习:)我甚至觉得这种序列化方式更可取,因为协议缓冲区具有向前和向后兼容性,而java序列化在这方面有问题。

Store?(和
pattern.flags()
,如果您可以使用非默认标志编译它)。@AndyTurner所以每次我从redis检索它时都必须编译它?您可能需要一些惰性的模式初始化。在第一次访问时只从redis读取一次,编译模式字符串并使用编译后的模式。检查@dpr每次调用api时我都从redis读取它,我需要执行一些正则表达式操作。实际上,
Pattern
实现了
Serializable
,也就是说,您可以依赖Java的(反)序列化。请参阅将其转换为base64并将字符串存储在redis中。但我不明白你为什么要用protobufs来做这个。
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;
}
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());
  }
}