Известные типы DataContract - передаваемый массив - PullRequest
2 голосов
/ 17 мая 2010

У меня проблемы при передаче универсального списка через операцию WCF. В этом случае есть список int. Пример 4 описан здесь в MSDN . Обратите внимание, что в примере MSDN описано:

// Это успешно сериализует и десериализует, потому что универсальный список эквивалентен int [], который был добавлен к известным типам.

Выше приведен DataContract:

    [DataContract]
    [KnownType(typeof(int[]))]
    [KnownType(typeof(object[]))]
    public class AccountData
    {
        [DataMember]
        public object accNumber1;

        [DataMember]
        public object accNumber2;

        [DataMember]
        public object accNumber3;

        [DataMember]
        public object accNumber4;


    }

На стороне клиента я вызываю операцию следующим образом:

DataTransfer.Service.AccountData data = new DataTransfer.Service.AccountData()
{
  accNumber1 = 100,
  accNumber2 = new int[100],
  accNumber3 = new List<int>(),
  accNumber4 = new ArrayList()
};
cService.AddAccounts(data);

Также вот декорации сгенерированного AccountData obj (прокси WCF):

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="AccountData", Namespace="http://schemas.datacontract.org/2004/07/DataTransfer.Service")]
[System.SerializableAttribute()]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(DataTransfer.Client.CustomerServiceReference.PurchaseOrder))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(DataTransfer.Client.CustomerServiceReference.Customer))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(int[]))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(object[]))]

Исключение составляет:

Произошла ошибка при попытке сериализации параметра http://tempuri.org/:myEntity. Сообщение InnerException было «Типовой список» с именем контракта данных «ArrayOfint: http://schemas.microsoft.com/2003/10/Serialization/Arrays' не ожидается Добавьте любые типы, не известные статически, в список известных Типы

1 Ответ

1 голос
/ 28 мая 2010

Если вы объявите свой тип следующим образом, сериализация работает нормально:

[DataContract]   
public class AccountData
{
    [DataMember]
    public object accNumber1 {get; set;}

    [DataMember]
    public int[] accNumber2 { get; set; }

    [DataMember]
    public List<int> accNumber3 { get; set; }

    [DataMember]
    public ArrayList accNumber4 {get; set;}

}

(я рекомендую использовать свойства вместо открытых полей.)

Вам действительно нужно, чтобы ваши поля имели тип объекта? Если приведенный выше класс слишком ограничен, есть способы сделать его более гибким, но, возможно, не таким гибким, как вы предполагали.

Также обратите внимание, что атрибут KnownType применяется ко всему классу, а не к отдельным свойствам.

...