WCF服务自动反序列化枚举。
[XmlType(Namespace = "http://rca.ws.emitere/2010-11/")]
public enum Animal
{
[System.Xml.Serialization.XmlEnumAttribute("Cat name")]
Cat,
[System.Xml.Serialization.XmlEnumAttribute("Dog name")]
Dog
}
使用
XmlElement(Form = XmlSchemaForm.Unqualified)]
public Animal anim{ get; set; }
当没有匹配正确时,我可以设置默认值吗?现在它会生成序列化错误。
我想在不更改wsdl的情况下返回验证消息。 Web服务有几种方法,每种方法都应该返回另一条消息。
答案 0 :(得分:0)
不幸的是,你被困在WCF合同中使用enum。
可以使用的一个选项是将属性类型anim
更改为String
,并添加由XmlIgnore
归因的其他属性,这些属性将在反序列化完成后包含所需的值。
请记住,您可能必须考虑序列化的相同“价值转移”。
我们假设anim
属性包含在:
public class Zoo
{
[XmlIgnore]
public Animal? animAsEnum { get; set; }
public string anim { get; set; }
[OnDeserialized]
private void OnDeserializedMethod(StreamingContext context)
{
Animal animAsEnum;
if (Enum.TryParse(anim, out animAsEnum))
{
this.animAsEnum = animAsEnum;
}
}
}
如何运作可以证明如下:
[TestMethod]
public void Zoo_Cateau()
{
string input = "<Zoo xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" "
+ "xmlns=\"http://schemas.datacontract.org/2004/07/UnitTestProject3\">"
+ "<anim>Cateau</anim></Zoo>";
Zoo target = Deserialize<Zoo>(input);
Assert.IsNotNull(target);
Assert.AreEqual("Cateau", target.anim);
Assert.IsNull(target.animAsEnum);
}
[TestMethod]
public void Zoo_Cat()
{
string input = "<Zoo xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" "
+ "xmlns=\"http://schemas.datacontract.org/2004/07/UnitTestProject3\">"
+ "<anim>Cat</anim></Zoo>";
Zoo target = Deserialize<Zoo>(input);
Assert.IsNotNull(target);
Assert.AreEqual("Cat", target.anim);
Assert.AreEqual(Animal.Cat, target.animAsEnum);
}
Deserialize<T>
方法来自Using DataContractSerializer to serialize, but can't deserialize back