使用 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