WCF-序列化/反序列化布尔值是/否,而不是true / false?

时间:2018-07-27 22:07:41

标签: c# wcf datacontractserializer

我正在编写WCF Web服务,该服务序列化到XML文档并从XML文档反序列化。 XML文件用作ERP和我的.Net Web服务之间的通信机制。我面临的问题是我无法控制正在发送yes / no的ERP的输出,因为该逻辑值需要反序列化为服务中的bool变量。

我正在将DataContractSerializer与DataContract和DataMember装饰一起使用。

DataContractSerializer ser = new DataContractSerializer(typeof(Order));
Order GenerateOrder = (Order)ser.ReadObject(readDoc.CreateReader());

如何对布尔属性反序列化是/否?

2 个答案:

答案 0 :(得分:1)

布尔值是本机.NET类型,.NET使用XML模式中定义的本机xsd:boolean对其进行序列化。所以不,您不能将布尔值序列化/反序列化为是/否。

另一种解决方案是,您可以定义自定义枚举并使用EnumMember标签自定义其序列化行为。

{word: [phrases...]}

如果您使用“是,否”作为枚举值,您甚至可以这样写:

[DataContract]
public enum MyBoolean
{
    [EnumMember(Value = "No")]
    False,

    [EnumMember(Value = "Yes")]
    True
}

答案 1 :(得分:1)

在大多数情况下,使用DataContract就足够了,但是在互操作性方案中,需要自定义序列化。尽管.NET不对布尔值使用“是”和“否”,但也许其他平台/语言也使用。因此,您必须在WCF中使用其他序列化方法。

考虑实现数据协定的IXmlSerializable接口,此接口可让您在较低级别上控制序列化和反序列化。

考虑WCF服务中使用的POCO的示例:

   public class Animal : IXmlSerializable
{

    public Animal()
    {

    }

    bool _isBipedal;
    public bool IsBipedal
    {
        get { return _isBipedal; }
        set { _isBipedal = value; }
    }

    string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        reader.MoveToContent();

        Name = reader.GetAttribute("Name");
        reader.ReadStartElement(); 

        IsBipedal = bool.Parse(reader.ReadElementString("IsBipedal") == "Yes" ? "true" : "false");
        reader.ReadEndElement(); 
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteAttributeString("Name", Name);
        writer.WriteElementString("IsBipedal", IsBipedal ? "Yes" : "No");
    }

}

请注意,此类不使用[DataContract]属性,而是实现IXmlSerializable。针对WCF操作运行客户端之后 返回此动物类型的列表,我们得到以下序列化的内容(请注意,在此处,电汇/响应可以使用“是”作为布尔值(通过Fiddler检查):

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetAnimalsResponse xmlns="http://tempuri.org/"><GetAnimalsResult xmlns:a="http://schemas.datacontract.org/2004/07/CustomWcfSerialization.Common" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">


不可以

关于IXmlSerializable-请注意,ReadXml方法将负责反序列化对象,而WriteXml方法将负责序列化对象。在大多数情况下,GetSchema方法可以返回null。

我已经准备了一个带有Visual Studio解决方案的小型演示项目,展示了如何在这里完成此操作:

git clone git@bitbucket.org:toreaurstad / wcfixmlserializabledemo.git