使用protobuf-net序列化枚举需要做些什么?我在序列化具有枚举属性的类时遇到以下错误,如果从属性声明中删除了DataMember属性,则它可以正常工作。
“System.InvalidOperationException:仅数据协定类(和列表/数组) 这样的)可以处理“
答案 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; }
}