protobuf-net枚举序列化

时间:2010-11-09 15:46:26

标签: enums protocol-buffers protobuf-net

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

“System.InvalidOperationException:仅数据协定类(和列表/数组) 这样的)可以处理“

2 个答案:

答案 0 :(得分:17)

怀疑他们实际上是两种不同的场景,但是关于Andrew添加的代码示例,这是因为它无法弄清楚(事先)它将要做什么关于默认值(默认情况下,数据在接收器处理为可选)。有三种方法可以解决这个问题:

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; }

答案 1 :(得分:4)

样品:

[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; }
}