【问题标题】:Validate and override defaults during parsing stage在解析阶段验证和覆盖默认值
【发布时间】:2016-05-24 11:59:28
【问题描述】:

使用 3.0.0-beta3 版本的 C# 原生包,根据 official documentation 在解析阶段分配默认值,无法区分是否根本没有传递值,对我而言,这是至关重要的一点,因为我想要对解码的原型实体进行某种验证,所以想知道是否有人有自定义数据验证或以任何方式覆盖/拦截解析阶段的经验?

一些基本的例子:

  1. 对于 int32 字段,以防它根本没有通过,所以我想处理这种情况并引发自定义异常,而不是默认 0
  2. 对于 int32 字段,我想强制执行允许的值范围,例如 100-1000,否则抛出解析异常
  3. 对于字符串字段,我想在解析/解码阶段强制执行最小长度

除了在 protobuf 包/API 之上编写自定义验证层之外,您建议如何执行此操作?我还是希望有一个扩展点但是还没有找到

【问题讨论】:

    标签: c# protocol-buffers protobuf-csharp-port proto3


    【解决方案1】:

    需要在应用代码解析后进行验证。解析器本身没有钩子来执行此操作。

    Proto3 不区分默认值字段和未发送字段。实际上,在发送端,如果该字段已显式设置为其默认值,则不会对其进行编码。所以,没有办法在 proto3 中实现你的第一条规则。

    【讨论】:

    • 不幸的是,这与我在文档中找到的相同。不知道使用 protobuf 的系统如何解决此类问题,似乎通过定义一些自定义默认值来区分 proto3 默认值,谢谢
    • @sll Proto3 也不支持自定义默认值;只有零/空。但实际上,答案是您不需要进行此验证。如果默认值是可接受的输入,则继续使用它。发送者有责任确保发送他们想要的值;您唯一需要在服务器上验证的是它们发送的值不会损坏服务器。
    猜你喜欢
    • 2013-10-23
    • 1970-01-01
    • 2020-01-17
    • 2014-04-04
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多