WCF服务XML序列化未生成XmlAttribute标记属性问题求助
问题描述
我有一个简单的WCF API:
[OperationContract] [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "movex/anp_prd")] Producer Test2();
对应的Producer类定义:
public class Producer { [XmlAttribute] public int Test { get; set; } [XmlElement] public string ProducerFound { get; set; } }
API实现如下:
public Producer Test2() { return new Producer { Test = 999, ProducerFound = "Yes" }; }
调用后得到的XML响应却是:
<Producer xmlns="http://schemas.datacontract.org/2004/07/HSL.FOPS.WCFService.DataTransferObjects" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <ProducerFound>Yes</ProducerFound> <Test>999</Test> </Producer>
我不明白为什么Test属性没有作为Producer的XML属性出现,而是被序列成了子元素。
原因分析
WCF默认使用DataContractSerializer进行序列化,而[XmlAttribute]、[XmlElement]是XmlSerializer专属的特性,DataContractSerializer不会识别这些特性——它只会识别[DataContract]和[DataMember]特性。所以即使你给Test加了[XmlAttribute],DataContractSerializer依然会把它当作普通的数据成员,序列成XML子元素。
解决办法
要让Test成为XML属性,你需要让WCF改用XmlSerializer处理序列化,具体方式如下:
方式一:在服务契约上添加[XmlSerializerFormat]特性
修改API契约定义,在服务接口或特定操作上加上[XmlSerializerFormat],明确告诉WCF使用XmlSerializer:
[OperationContract] [XmlSerializerFormat] // 添加该特性 [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "movex/anp_prd")] Producer Test2();
Producer类的特性无需修改(你已经添加了[XmlAttribute]和[XmlElement],这是XmlSerializer能识别的)。修改后序列化的XML会变成:
<Producer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Test="999"> <ProducerFound>Yes</ProducerFound> </Producer>
方式二:改用DataContractSerializer的等效配置(不推荐)
DataContractSerializer本身不支持将成员序列为XML属性,因此如果坚持使用它,无法实现把Test转为XML属性的需求,只能接受它作为子元素。因此更推荐使用方式一。
内容的提问来源于stack exchange,提问作者Hiren Amin
相关产品推荐
相关产品推荐

