java - 如何使用 protobuf 序列化 java.util.regex.Pattern?
问题描述
我有一个对象,我想使用协议缓冲区序列化并存储在 redis 中。对象包含在java.util.regex.Pattern
实例化对象时遵守的 。
public class SerializableEntity {
private Pattern pattern;
private List<String> options;
}
此模式用于验证对某个 api 的输入。由于每次编译模式都很昂贵,所以我在实例化期间编译一次模式,然后在每次调用 api 时重用相同的模式实例。如何Pattern
在以下模式中序列化此编译字段,以便在反序列化对象时无需再次编译模式即可使用它?
message SerializableEntityProto {
repeated string option = 1;
// compiled 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 序列化则存在问题。
推荐阅读
- ruby - 如何动态扩展类上的模块?
- python - 在 XML 文件中找到一行并使用 python 将下一行替换为其他内容
- c# - C#如何从子类获取父类属性
- xpages - 我可以使用 Domino 服务器代理 HTTPS 请求吗?
- android - 将列表中的每个元素与列表中的其他元素进行比较
- php - Symfony 4:在测试 + 控制器 + 树枝扩展中保持 SQLite PDO 连接
- wordpress - WORDPRESS CORS 策略:请求的资源上不存在“Access-Control-Allow-Origin”标头
- vue.js - vue组件注册和路由
- javascript - 循环中的循环总增量,但之后打印时返回 0
- botframework - 是否可以在 Bot 框架自适应卡片输入中自动完成?