WCF: общий список, сериализованный в массив - PullRequest
3 голосов
/ 30 июня 2011

Итак, я работаю с WCF, и мои сервисы возвращают типы, которые содержат общие списки. WCF в настоящее время конвертирует их в массивы по проводам. Есть ли способ настроить WCF для последующего преобразования их в списки? Я знаю, что есть способ, нажав кнопку «Дополнительно» при добавлении ссылки на службу, но я ищу решение в файлах конфигурации или что-то подобное.

[DataContract(IsReference = true)]
public class SampleObject
{
  [DataMember]
  public long ID { get; private set; }

  [DataMember]
  public ICollection<AnotherObject> Objects { get; set; }
}

Это очень странно, потому что одна служба возвращает его в виде списка, а другая - в виде массива, и я уверен, что они настроены одинаково.

Ответы [ 5 ]

7 голосов
/ 01 июля 2011

enter image description here

На вкладке «Дополнительно» при добавлении ссылки на услугу вы также можете установить эту опцию.стандартные массивы установлены.

3 голосов
/ 30 июня 2011

Я думаю, что это просто из-за того, что клиентский инструмент генерирует контракты из WSDL.В моем случае я создал повторно используемую .dll, содержащую мои классы [OperationContract] и [DataContract], и использую ее как на клиенте, так и на сервере, вместо того, чтобы сгенерировать ее с помощью SvcUtil.Таким образом, я сохраняю свои списки генериков.

1 голос
/ 30 июня 2011

Я нашел решение, которое было намного проще и работало достаточно хорошо для меня, хотя оно может не работать для других.Я просто переключился с использования ICollection (IList также выдает этот результат) на List.После этого все работало нормально.

Решение от Здесь .

Я также нашел возможное решение для конфигурации из Здесь у основания.

<CollectionMappings>
    <CollectionMapping TypeName="ChangeTracker.ChangeTrackingCollection'1" Category="List" />
</CollectionMappings>
1 голос
/ 30 июня 2011

Кроме того, позаботьтесь о том, чтобы в классах, из которых вы сериализовали экземпляры с WCF, не было ни массивов, ни обобщений, потому что у вас возникнет проблема при десериализации: все будет преобразовано либо в ArrayOf (если вы этого не сделаете изменить конфигурацию) или тип коллекции.

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

Это был всего лишь мой двухцентровый совет из того, что я узнал во время небольшого проекта с WCF. :)

0 голосов
/ 07 марта 2013

Вместо использования ICollection<AnotherObject> в вашем контракте данных, оно будет сгенерировано в клиентском приложении как AnotherObject[].

Попробуйте это:

определить новый контракт данных

[CollectionDataContract]
public class AnotherObjectCollection : List<AnotherObject> {}

в вашем коде:

DataContract(IsReference = true)]
public class SampleObject
{
  [DataMember]
  public long ID { get; private set; }

  [DataMember]
  public AnotherObjectCollection Objects { get; set; }
}

в Visual Studio (аналогично svcUtil) код прокси клиента будет выглядеть так:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.CollectionDataContractAttribute(Name="AnotherObjectCollection", Namespace="http://schemas.datacontract.org/2004/07/SampleObject", ItemName="AnotherObject")]
[System.SerializableAttribute()]
public class AnotherObjectCollection : System.Collections.Generic.List<AnotherObject> {}

 DataContract(IsReference = true)]
    public class SampleObject
    {
      [DataMember]
      public long ID { get; private set; }

      [DataMember]
      public AnotherObjectCollection Objects { get; set; }
    }

Это также работает для встроенных типов .NET.

1020 * антонио *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...