为何带EnumMember属性的WCF枚举会创建大量对象?
WCF中带EnumMember属性的枚举对象重复创建问题解析
两种枚举的核心区别
- 不带
EnumMember的枚举:WCF默认采用数值序列化/反序列化逻辑,CLR本身会缓存枚举的静态实例,所以不管处理多少请求,同一个枚举值只会存在1个对象实例。public enum Status { NotActive = 1, Active = 2 } - 带
EnumMember的枚举:WCF会切换为字符串序列化/反序列化(基于DataContractSerializer的规则),每次反序列化字符串到枚举时,内部会通过反射生成新的枚举包装对象,不会复用已有实例,高并发请求下就会出现数千个重复对象。public enum Status { [EnumMember] NotActive = 1, [EnumMember] Active = 2 }
当初添加EnumMember的可能原因
- 需要将枚举序列化为自定义字符串(比如给
EnumMember加Value参数:[EnumMember(Value = "Inactive")],序列化后就会输出"Inactive"而非枚举名"NotActive") - 兼容旧的服务/客户端协议,比如早期接口约定用字符串传递状态值
- 隐藏特定枚举值:未添加
EnumMember的枚举值不会被序列化,可用来标记废弃或内部使用的枚举项
修改建议
- 如果业务不需要字符串序列化逻辑,直接移除
EnumMember属性即可,WCF会自动切换回数值序列化,复用枚举静态实例,解决内存对象过多的问题。 - 如果必须保留字符串序列化(比如要兼容老客户端),可以自定义枚举的序列化逻辑,或者在服务端/客户端添加枚举实例缓存,减少重复对象的创建。
内容的提问来源于stack exchange,提问作者Antero00
相关产品推荐
相关产品推荐

