C#允许为枚举分配任何整数值.
当我尝试使用enum字段序列化(通过protobuf-net)对象时,该值超出范围,它会抛出异常:没有将wire-value映射到枚举PersonLevel.
我的枚举PersonLevel没有Flags属性.
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public enum PersonLevel
{
Unknown = 1
}
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public class Person
{
...
public PersonLevel PersonLevel { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
var ms = new MemoryStream();
var person = new Person
{
...
PersonLevel = (PersonLevel) 500
...
};
Serializer.Serialize(ms, person); //No wire-value is mapped to the enum PersonLevel
Run Code Online (Sandbox Code Playgroud)
是否有任何设施可以在不改变业务对象的情况下(也许是任何protobuf attrubutes)?
有几种方法可以告诉它简化规则; 正如Ravadre所说,[Flags]自动禁用验证 - 它会导致EnumPassthru切换.您也可以手动执行此操作 - 只要在开始序列化/反序列化之前:
RuntimeTypeModel.Default[typeof(PersonLevel)].EnumPassthru = true;
Run Code Online (Sandbox Code Playgroud)
有描述:
/// <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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2996 次 |
| 最近记录: |