Protobuf-net 序列化枚举值超出范围

2023-12-10

C# 允许将任何整数值分配给 enum。

当我尝试使用值超出范围的枚举字段序列化(通过 protobuf-net)对象时,它会抛出异常:没有线值映射到枚举 PersonLevel。

我的枚举 PersonLevel 没有 Flags 属性。

[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public enum PersonLevel
{
  Unknown = 1
}

[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public class Person
{
  ...

  public PersonLevel PersonLevel { get; set; }

  ...
}
var ms = new MemoryStream();

var person = new Person
{
  ...
  PersonLevel = (PersonLevel) 500
  ...
};

Serializer.Serialize(ms, person); //No wire-value is mapped to the enum PersonLevel

是否有任何工具可以在不更改业务对象(可能是任何 protobuf 属性)的情况下完成此操作?


有几种方法可以告诉它以简化规则;正如拉瓦德尔所说,[Flags]自动禁用验证 - 它会导致EnumPassthru变为切换状态。您也可以手动执行此操作 - 只要它是before你开始序列化/反序列化:

RuntimeTypeModel.Default[typeof(PersonLevel)].EnumPassthru = true;

其中有描述:

/// <summary>
/// Gets or sets a value indicating that an enum should be treated directly as an int/short/etc, rather
/// than enforcing .proto enum rules. This is useful *in particular* for [Flags] enums.
/// </summary>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Protobuf-net 序列化枚举值超出范围 的相关文章

随机推荐