WCF默认使用XMLSerializer时能否为内部类切换到DataContractFormat序列化
WCF序列化器优先级规则
- WCF的序列化器选择优先级为 操作契约注解 > 服务契约注解 > 全局配置,不存在类级别的序列化器覆盖逻辑,这也是你测试失效的核心原因。
- 当你在服务接口上全局标注
[XmlSerializerFormat]指定默认使用XMLSerializer时,仅给类属性加[DataMember]注解不会触发DataContractSerializer,序列化器不会识别类级别的序列化格式切换要求。
实现需求的正确方案
如果需要保持全局默认用XMLSerializer,仅少量接口操作关联的类用DataContract序列化,需要给对应的操作契约单独添加[DataContractFormat]注解,示例如下:
// 服务接口全局默认使用XmlSerializer [ServiceContract, XmlSerializerFormat] public interface IYourService { // 普通操作,沿用全局XmlSerializer [OperationContract] void CommonOp(CommonClass param); // 单独指定该操作使用DataContractSerializer [OperationContract, DataContractFormat] void SpecialOp(SpecialClass param); } // 该类会被SpecialOp操作的DataContractSerializer处理 [DataContract] public class SpecialClass { //[XmlIgnore] [DataMember] public string Var { get => _var; set => _var= value; } }
注意事项
- 不要让同一个数据类同时被使用
XMLSerializer和DataContractSerializer的操作引用,否则会出现序列化预期不符的问题,建议拆分不同场景的数据类避免冲突。 - 重新生成客户端服务引用后,需要确认服务端的操作注解已经生效,再校验属性同步情况。
内容的提问来源于stack exchange,提问作者Adrián
相关产品推荐
相关产品推荐

