DataContract Known Types - передаваемый массив

У меня проблемы при передаче общего списка через операцию 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 (прокси 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 'не ожидается. Добавить любые типы, не известные статически, в список известных типов.


person Erup    schedule 17.05.2010    source источник
comment
Извините, я добавил описание исключения сейчас. Обратите внимание, что он уже включает атрибут KnownTypeAttribute, как указано в DataContract.   -  person Erup    schedule 17.05.2010
comment
У меня та же проблема. Вы не можете добавить int [] и List ‹int› к известным типам, потому что это вызовет ошибку с жалобой на то, что они одинаковы. Однако, если я просто добавлю int [], для List будет выброшено исключение сериализации ‹int›. Странный....   -  person Mas    schedule 07.03.2011
comment
Вы устранили проблему, у меня аналогичная проблема   -  person    schedule 23.08.2011


Ответы (1)


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

[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 применяется ко всему классу, а не к отдельным свойствам.

person Stefan Egli    schedule 28.05.2010
comment
Я проводил тесты с KnownTypeAttribute и изучал пример MSDN (вот почему объектная опора). Я попробую ваше предложение. Спасибо. - person Erup; 28.05.2010