WCF序列化异常

WCF序列化异常,wcf,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 p

我有一个类型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
}
[可序列化]
公共类MyParameter:IXmlSerializable
{
公共字符串名称{get;set;}
公共字符串值{get;set;}
公共字符串Mytype{get;set;}
#区域IXmlSerializable成员
public System.Xml.Schema.XmlSchema GetSchema()
{
返回null;
}
public void ReadXml(System.Xml.XmlReader)
{
XElement e=XElement.Parse(reader.ReadOuterXml());
IEnumerable i=e.Elements();
列表l=新列表(i);
Name=l[0]。Name.ToString();
Value=l[0]。Value.ToString();
Mytype=l[0]。属性(“类型”)。值。ToString();
}
public void WriteXml(System.Xml.XmlWriter)
{
writer.writeStart元素(名称);
WriteAttributeString(“xsi:type”,Mytype);
writer.WriteValue(值);
writer.writeedelement();
}
#端区
}
服务合同如下所示:

[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; }
}
[DataContract]
公共类数据
{
公共字符串名称{get;set;}
公共列表参数{get;set;}
}
当我运行服务并测试它时 我在MyParameter的readXml中获得异常 “未定义前缀xsi” xsi应定义命名空间“”

我如何解决这个问题


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

您必须明确地告诉XmlWriter xsi映射到什么。请尝试以下方法:

writer.WriteAttributeString("xsi", "type", "http://w3.org/2001/xmlschema-instance", MyType);
[DataContract]
public class Data {

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

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

}

我不确定您是否需要IXmlSerializable。WCF尝试在后台处理序列化,而不会打扰您

看起来您可能缺少DataContract对象上的几个属性。请尝试以下方法:

writer.WriteAttributeString("xsi", "type", "http://w3.org/2001/xmlschema-instance", MyType);
[DataContract]
public class Data {

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

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

}
[DataContract]
公共类数据{
[数据成员]
公共字符串名称{get;set;}
[数据成员]
公共列表参数{get;set;}
}

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

我不明白您能解释一下吗您不明白什么?很简单,您假设XmlWriter以某种方式神奇地知道xsi前缀映射到什么。它没有,所以你必须明确地告诉它。只需将编写xsi:type属性的行替换为我提供的内容。