我有一个要使用协议缓冲区序列化并存储在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
}
谢谢。
答案 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序列化对此存在问题。