首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Protobuf-net序列化枚举的值超出范围

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

Stack Overflow用户
提问于 2013-03-01 18:20:38
回答 2查看 3.4K关注 0票数 3

C#允许将任何整数值赋给枚举。

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

我的枚举PersonLevel没有标志属性。

代码语言:javascript
复制
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public enum PersonLevel
{
  Unknown = 1
}

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

  public PersonLevel PersonLevel { get; set; }

  ...
}
代码语言:javascript
复制
var ms = new MemoryStream();

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

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

有没有什么工具可以在不更改业务对象(可能是任何协议属性)的情况下完成这项工作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-01 20:00:16

有几种方法可以告诉它简化规则;正如拉瓦德指出的那样,[Flags]会自动禁用验证-它会导致EnumPassthru被切换。您也可以手动执行此操作-只要在开始序列化/反序列化之前为

代码语言:javascript
复制
RuntimeTypeModel.Default[typeof(PersonLevel)].EnumPassthru = true;

它的描述是:

代码语言:javascript
复制
/// <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>
票数 6
EN

Stack Overflow用户

发布于 2013-03-01 18:33:19

您可以做的是创建一个int字段,将其打包到protobuf消息中并公开一个属性,该属性将把您的int字段公开为您类型的enum (作为一个包装器)。

如果你使用的是隐式字段,这可能会比较困难,因为protobuf可能会同时序列化你的整数和enum属性。您可以尝试显式[ProtoIgnore]您的enum属性。

但是,如果枚举被标记为[Flags]属性,protobuf会自动为您执行此操作,因此将枚举更改为:

代码语言:javascript
复制
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
[Flags]
public enum PersonLevel
{
    Unknown = 1
}

应该能让它工作起来。至少在版本2中是这样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15155311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档