【发布时间】:2019-02-12 12:23:55
【问题描述】:
我有一个对象,我想使用协议缓冲区序列化并存储在 redis 中。该对象包含一个java.util.regex.Pattern,该对象在实例化时被编译。
public class SerializableEntity {
private Pattern pattern;
private List<String> options;
}
此模式用于验证对某个 api 的输入。由于每次编译模式都是expensive,所以我在实例化期间编译一次模式,然后在每次调用 api 时重用相同的模式实例。如何在以下架构中序列化此 compile Pattern 字段,以便在反序列化对象时无需再次编译模式即可使用它?
message SerializableEntityProto {
repeated string option = 1;
// compiled pattern
}
谢谢。
【问题讨论】:
-
存储
pattern.pattern()? (和pattern.flags(),如果您可以使用非默认标志编译它)。 -
@AndyTurner 所以每次我从redis检索它时都必须编译它?
-
您可能需要对模式进行一些延迟初始化。首次访问时仅从 redis 读取一次,编译模式字符串并使用编译后的模式。检查lazy initialization on demand holder idom
-
@dpr 每次调用 api 时我都会从 redis 读取它,我需要执行一些正则表达式操作。无法将其存储在本地。
-
其实
Pattern实现了Serializable,也就是说你可以依赖Java的(反)序列化。见stackoverflow.com/questions/2836646/…也许将其转换为base64并将字符串存储在redis中。但我不明白你为什么要为此使用 protobufs。
标签: java serialization protocol-buffers protobuf-java