WCF序列化异常

时间:2010-08-17 12:37:37

标签: wcf

我有一个MyParameter类型,我将其作为参数传递给wcf服务

[Serializable]
public class MyParameter : IXmlSerializable
{
    public string Name { get; set; }
    public string Value { get; set; }
    public string Mytype { get; set; }

    #region IXmlSerializable Members

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        XElement e = XElement.Parse(reader.ReadOuterXml());
        IEnumerable<XElement> i = e.Elements();
        List<XElement> l = new List<XElement>(i);
        Name = l[0].Name.ToString();
        Value = l[0].Value.ToString();
        Mytype = l[0].Attribute("type").Value.ToString();
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        writer.WriteStartElement(Name);
        writer.WriteAttributeString("xsi:type", Mytype);
        writer.WriteValue(Value);
        writer.WriteEndElement();
    }

    #endregion
}

服务合同如下:

[ServiceContract]
public interface IOperation
{
[OperationContract]
void Operation(List<Data> list);

}

其中数据定义数据合同

[DataContract]
public class Data
{
public string Name { get; set; }
public List<MyParameter> Parameters{ get; set; }
}

当我运行服务并测试它时 我在MyParameter的readXml中得到了异常 “前缀xsi未定义” xsi应该定义命名空间“http://w3.org/2001/xmlschema-instance

如何解决问题?

我对此非常陌生,因此示例代码将非常有用

2 个答案:

答案 0 :(得分:0)

您必须明确告诉XmlWriter xsi映射到的内容。试试这个:

writer.WriteAttributeString("xsi", "type", "http://w3.org/2001/xmlschema-instance", MyType);

答案 1 :(得分:0)

我不确定你需要IXmlSerializable。 WCF尝试在后台处理序列化而不必为此烦恼。

看起来您可能在DataContract对象上缺少几个属性。试试这个:

[DataContract]
public class Data {

[DataMember]
public string Name { get; set; }

[DataMember]
public List<string> Parameters { get; set; }

}

[DataMember]属性标记您希望WCF自动为您序列化的属性。