XML-сериализация Проблема с использованием WCF - PullRequest
1 голос
/ 26 июня 2010

У меня есть служба WCF, которая использует контракт Message для запроса и ответов на данные. Это контракт на обслуживание:

 [ServiceContract()]
 public interface ISalesFinderService
 {
     [OperationContract()]
     Response DoSomething(Request i_Info);
 }

Проблема возникает, когда служба возвращает ответ. Это ответное сообщение:

[MessageContract()]
public class ObjectInfo
{
    [MessageBodyMember(Name = "Name")]
    public string  m_Name;
}

[MessageContract()]
public class Response
{
   private List<ObjectInfo> m_MyListOfObjects;

   public FindSalesByLocationInfoMessageResponse()
   {
       m_MyListOfObjects = new List<ObjectInfo>();
   }

   [MessageBodyMember(Name = "ObjectsInfo")]
   public List<ObjectInfo> MyListOfObjects
   {
            get { return m_MyListOfObjects;  }
            set { m_MyListOfObjects = value; }
   }
}

Когда ответ приходит, я вижу (через wireshark), что все поля в списке (типа ObjectInfo) были сериализованы в XML и получили тег <a:m_Name></a:m_Name> хотя я специально добавил атрибут MessageBodyMember над элементом данных m_Name и дал ему «Имя» в качестве тега.

Как я могу изменить имена этих тегов по своему желанию ???

спасибо ..

1 Ответ

1 голос
/ 26 июня 2010

Я думаю, вы неправильно понимаете причину контракта на сообщения и как его использовать. Ознакомьтесь с документацией MSDN по Использование контрактов сообщений для более подробного обсуждения.

Контракт сообщения позволяет вам определить макет вашего сообщения с заголовком (заголовками) и элементами тела. Это могут быть атомарные типы, такие как string или int, и если нет, вам нужно определить составные типы как классы.

Те составные части (классы), которые вы используете в этом сообщении, должны быть помечены как [DataContract] с [DataMember] атрибутами в отдельных полях, которые вы хотите сериализовать.

Кроме того, ваш контракт на передачу сообщений и контракт на передачу данных никогда не должен содержать никаких функций и всего, что должно быть выполнено. Структуры данных будут сериализованы только как данные, любое поведение будет потеряно при передаче.

Так что в вашем случае вы должны попробовать:

[MessageContract()]
public class Response
{
    private List<ObjectInfo> m_MyListOfObjects = new List<ObjectInfo>();

    [MessageBodyMember(Name = "ObjectsInfo")]
    public List<ObjectInfo> MyListOfObjects
    {
        get { return m_MyListOfObjects;  }
        set { m_MyListOfObjects = value; }
    }
}

[DataContract]
public class ObjectInfo
{
    [DataMember(Name = "Name")]
    public string m_Name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...