我找不到一种方法来屏蔽 protobuf 结构中的某些字段。我确实阅读了有关 FieldMaskUtil 的内容并尝试了几个示例,但它似乎做了相反的操作,即复制 FieldMask 中提到的字段,这与我想要的不同。这是示例结构和相应的测试代码。
Proto:
syntax = "proto3";
package model;
option java_package = "test.demo.services.protobuf.customer.model";
option java_outer_classname = "CustomerProto";
message Accounts {
repeated Account account = 1;
}
message Account {
int32 id = 1;
string number = 2;
int32 customer_id = 3;
}
message Customers {
repeated Customer customers = 1;
}
message Customer {
int32 id = 1;
string pesel = 2;
string name = 3;
CustomerType type = 4;
repeated Account accounts = 5;
enum CustomerType {
INDIVIDUAL = 0;
COMPANY = 1;
}
}
这是示例测试代码
package test.demo.services.protobuf.customer.model;
import org.junit.Test;
import test.demo.services.protobuf.customer.model.CustomerProto.Customer;
import com.google.protobuf.util.FieldMaskUtil;
public class TestMerge {
@Test
public void eraseFields() {
Customer request = Customer.newBuilder().setId(10).setPesel("12345").setName("Harry Alto").build();
// Erase name
Customer.Builder modifieldRequest = Customer.newBuilder();
FieldMaskUtil.merge(FieldMaskUtil.fromString("name"), request, modifieldRequest);
System.out.println( modifieldRequest.build().toString());
}
}
这是输出:
name: "Harry Alto"
我所期望的是打印除姓名以外的所有内容
id: 10
pesel: "12345"
有没有办法做我想做的事
FieldMaskUtil.merge(FieldMaskUtil.fromString("name"), request, modifieldRequest);
我所期望的是打印除姓名以外的所有内容
不,根据 JavaDocsFieldMask https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/FieldMask,行为与您所描述的相反:
字段掩码用于指定应该是的字段子集
由获取操作返回或由更新操作修改。
掩码充当集合交集运算,仅选择指定的字段。在您的情况下,掩码仅指定“名称”,因此这就是它选择的内容。
您正在寻找的行为实际上是一个集合补码操作,选择所有未指定的字段。我不知道 Protobuf API 中有内置方法可以执行此操作。自行实现此操作的选项有:
- 构造多个
FieldMask
使用单独调用的实例FieldMask#fromString
对于您想要保留的每个命名字段。然后,使用FieldMaskUtil#union https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/util/FieldMaskUtil#union-com.google.protobuf.FieldMask-com.google.protobuf.FieldMask-com.google.protobuf.FieldMask...-将它们全部结合起来。这将仅保留特别列出的字段。如果您稍后改进架构以添加更多字段,那么它不会选择这些新字段。您必须更改代码并将新的命名字段添加到该联合中。
- Call MessageOrBuilder#getAllFields https://developers.google.com/protocol-buffers/docs/reference/java/com/google/protobuf/MessageOrBuilder#getAllFields--获取消息中所有字段的描述符。迭代所有这些,使用
FieldMaskUtil#union
如上所述,但跳过您想要忽略的特定字段,例如“名称”。如果您稍后改进架构以添加更多字段,那么这将选取这些新字段。您无需更改代码即可开始包含这些新字段。
请注意这些解决方案中模式演变的差异。选择哪一种最合适取决于您的要求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)