如何使用 protobuf 序列化 java.util.regex.Pattern?
How to serialize a java.util.regex.Pattern using protobuf?
我有一个对象,我想使用 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 序列化存在问题。
我有一个对象,我想使用 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 序列化存在问题。