Исключение сериализации WCF - PullRequest
0 голосов
/ 17 августа 2010

У меня есть тип 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; }
}

когда я запускаю службу и проверяю ее, я получаю исключение в readXml MyParameter "префикс xsi не определен" xsi должен определять пространство имен "http://w3.org/2001/xmlschema-instance"

Как мне решить проблему?

Я очень новичок в этом, поэтому пример кода будет очень полезен

Ответы [ 2 ]

0 голосов
/ 22 ноября 2010

Я не уверен, что вам нужен IXmlSerializable. WCF пытается обработать сериализацию в фоновом режиме, не беспокоясь об этом.

Похоже, вам не хватает пары атрибутов в вашем объекте DataContract. Попробуйте вместо этого:

[DataContract]
public class Data {

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

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

}

Атрибут [DataMember] отмечает, какие свойства вы хотите, чтобы WCF автоматически сериализировал для вас.

0 голосов
/ 17 августа 2010

Вы должны явно указать XmlWriter, на что отображается xsi. Попробуйте вместо этого:

writer.WriteAttributeString("xsi", "type", "http://w3.org/2001/xmlschema-instance", MyType);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...