使用XmlEnumAttribute进行WCF反序列化

时间:2018-01-24 13:45:48

标签: c# wcf xml-attribute

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服务有几种方法,每种方法都应该返回另一条消息。

1 个答案:

答案 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