使用 XmlEnumAttribute 的 WCF 反序列化
WCF deserialization with XmlEnumAttribute
枚举由 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; }
当没有匹配项时,我可以设置默认值吗?现在它会产生一个序列化错误。
我想 return 验证消息而不更改 wsdl。 Web 服务有多种方法,每种方法都应 return 另一条消息。
不幸的是,您陷入了在 WCF 合同中使用枚举的困境。
一个适合您的选项是将 属性 anim
的类型更改为 String
并添加其他 属性 归因于 XmlIgnore
,它将在之后包含您想要的值反序列化完成。
请记住,通过这种方式,您可能还必须考虑使用相同的 "value transfer" 进行序列化。
假设 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
枚举由 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; }
当没有匹配项时,我可以设置默认值吗?现在它会产生一个序列化错误。
我想 return 验证消息而不更改 wsdl。 Web 服务有多种方法,每种方法都应 return 另一条消息。
不幸的是,您陷入了在 WCF 合同中使用枚举的困境。
一个适合您的选项是将 属性 anim
的类型更改为 String
并添加其他 属性 归因于 XmlIgnore
,它将在之后包含您想要的值反序列化完成。
请记住,通过这种方式,您可能还必须考虑使用相同的 "value transfer" 进行序列化。
假设 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