【问题标题】:protobuf-net enum serializationprotobuf-net 枚举序列化
【发布时间】:2011-05-07 08:10:10
【问题描述】:

为了使用 protobuf-net 序列化枚举需要做什么?序列化具有枚举属性的类时出现以下错误,如果从属性声明中删除 DataMember 属性,它可以正常工作。

“System.InvalidOperationException:仅数据合同类(和列表/数组) 此类) 可以处理"

【问题讨论】:

  • 你有例子吗?这应该可以正常工作...
  • 马克你好!感谢您发布有关使用 Protobuf.net 反序列化 List 的帖子。我有同样的问题。我将在下面发布示例。
  • 请注意,这个问题正在meta 上讨论。您是否有理由回滚包括 MCVE 在内的编辑?你的情况和安德鲁斯有什么不同吗?

标签: enums protocol-buffers protobuf-net


【解决方案1】:

示例:

[DataContract]
[ProtoContract]
public enum SiteType
{
    [EnumMember]
    [ProtoEnum]
    Site = 1,
    [EnumMember]
    [ProtoEnum]
    Partition = 2,
    [EnumMember]
    [ProtoEnum]
    Module = 3
}

[DataContract]
[Serializable]
[ProtoContract]
public class SiteDTO
{
    [DataMember]
    [ProtoMember(1)]
    public int Id { get; set; }
    ...
    [DataMember]
    [ProtoMember(10)]
    public SiteType Type { get; set; }
}

【讨论】:

  • 感谢安德鲁的例子。我现在在本地拥有它,并将通过它。我想象它只是过于热衷于确定它是一个复杂的对象。我想在我的 WCF 使用中,我从来没有用[DataContract] 装饰枚举。我还没有检查,但我认为如果您删除枚举上的属性,它可以正常工作?
  • 当我尝试这样做时,我得到的错误是关于默认枚举值(这是你看到的吗?),这与 Al 报告的并不完全相同。但是,我添加了一条回复,(我认为)解决了您的问题。
【解决方案2】:

怀疑它们实际上是2个不同的场景,但是关于Andrew添加的代码示例,这是因为它无法(提前)弄清楚它会做什么关于默认值(默认情况下,数据在接收者处被视为可选)。有 3 种方法可以解决此问题:

1:添加一个值为 0 的枚举(因为 0 始终是 CLI 默认值为零),例如

public enum SiteType
{
    Error = 0,
    ...

2:告诉它默认使用哪个值:

[ProtoMember(10), DefaultValue(SiteType.Partition)]
public SiteType Type { get; set; }

3:告诉引擎它真的不需要担心它,即它会有一个值:

[ProtoMember(10, IsRequired = true)]
public SiteType Type { get; set; }

【讨论】:

  • 谢谢。现在它起作用了!使用 protobuf-net,我减少了流量,使用 WCF 服务将速度提高了 10 倍。这确实是提高性能的好方法。我认为这应该是使用这个协议\网络的常见方式。不幸的是,没有很多关于将 protobuf.net 与 WCF 一起应用的示例
  • @Andrew - 已记录反馈。我会努力改进的。
  • 我的问题是我们一直在序列化一个对象列表,并且其中一个属性没有 IsRequired = true。我想在这种情况下包含一个内部异常会很好。
  • @Al - 好的;我将调整 v2 以使其更加明显。但在某种程度上,我很高兴这是同一个问题,现在已经解决了。
  • 这个答案是否仍然适用于 v2.0.0.480?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多