如何使用protobuf序列化java.util.regex.Pattern?
我有一个对象,我想使用协议缓冲区序列化并存储在redis中。该对象包含一个如何使用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调用都会初始化一个
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());
}
}