我正在编写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());
如何对布尔属性反序列化是/否?
答案 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