我听说有些人说枚举是邪恶的,不应该在Web服务中使用,因为如果分配了一些值,或者枚举标记了Flags属性,服务器和客户端之间可能会出现不匹配.他们还说,暴露枚举的网络服务难以维护,但实际上并没有给我可行的论据.那么根据您的经验,在WCF Web服务中使用枚举的优缺点是什么?
当我使用DataContractJsonSerializer序列化枚举值时,它序列化枚举的数值,而不是字符串名称.
IE:
enum foo
{
bar,
baz
}
Run Code Online (Sandbox Code Playgroud)
序列化foo.bar的值将返回"0",而不是"bar".
相反,我更喜欢它,有没有办法覆盖它?
编辑:
因为我不想更改序列化程序,所以我使用了一个简单的解决方法.
我在类中公开了一个属性来序列化,调用ToString值,即:
// Old
[DataMember]
public EnumType Foo
{
get { return _foo; }
set { _foo = value; }
}
// New, I still kept the EnumType but I only serialize the string version
public EnumType Foo
{
get { return _foo; }
set { _foo = value; }
}
[DataMember]
public string FooType
{
get { return _foo.ToString(); }
private set {}
}
Run Code Online (Sandbox Code Playgroud) 我有一个枚举:
public enum FilterOperator
{
[EnumMember(Value = "eq")]
Equals,
[EnumMember(Value = "gt")]
GreaterThan,
[EnumMember(Value = "lt")]
LessThan,
[EnumMember(Value = "in")]
In,
[EnumMember(Value = "like")]
Like
}
Run Code Online (Sandbox Code Playgroud)
以及包含枚举属性的类:
public class GridFilter
{
[JsonProperty("operator")]
[JsonConverter(typeof(StringEnumConverter))]
public FilterOperator Operator { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
该对象通过WebAPI操作传入,并按预期对“ like”和“ in”进行反序列化,但不适用于“ lg”或“ gt”。知道为什么吗?
更新:好吧,“喜欢”和“从事”工作的原因是它们与枚举名称匹配。将GreaterThan重命名为Gt(etc)是可行的。因此,真正的问题是为什么不使用StringEnumConverter?