首页 > 解决方案 > 如何使用 protobuf 序列化 java.util.regex.Pattern?

问题描述

我有一个对象,我想使用协议缓冲区序列化并存储在 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
 }

谢谢。

标签: javaserializationprotocol-buffersprotobuf-java

解决方案


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


推荐阅读