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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用protobuf序列化java.util.regex.Pattern?相关的知识,希望对你有一定的参考价值。

我有一个对象,我想使用Protocol Buffers序列化并存储在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
 }

谢谢。

答案

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

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

另一答案

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序列化有问题。

以上是关于如何使用protobuf序列化java.util.regex.Pattern?的主要内容,如果未能解决你的问题,请参考以下文章

Netty如何使用Protobuf 序列化

如何使用 protobuf 序列化大型嵌套数组?

使用 ProtoBuf-Net,如何(反)序列化多维数组?

如何使用 protobuf 在 C# 中序列化字典?

如何通过 ProtoBuf-net 使用 DateTimeKind 选项序列化 DateTime 字段

如何使用 kotlinx.serialization 将库类序列化为 Protobuf?