Проблема сериализации LINQ to SQL с объектом SOAP - PullRequest
0 голосов
/ 28 мая 2010

ОК, так что это самая странная проблема в программировании .net, которую я когда-либо видел. Кажется, что поля объекта сериализуются в веб-сервисах .net в порядке инициализации поля.

Все началось с того, что Flex не принял SOAP-ответ от веб-службы .net. Я выяснил, что это было связано с порядком сериализованных полей, в которых определялся порядок полей в объявленном сериализуемом классе.

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

Пример, чтобы получить идею:

[Serializable]
public class SomeSample
{
    public int A;
    public int B;
    public int C;
}

Я запрашивал некоторые таблицы данных в веб-сервисе asmx, используя linq и возвращая список объектов SomeSample:

var r = (from ...... select new SomeSample { A = 1, C = 3 }).ToList();

Теперь список был еще раз повторен, и в поле B было применено некоторое значение (напр. 2).

Однако возвращенный мыльный конверт содержал следующую выдержку:

<A>1</A><C>3</C><B>2</B>

Обратите внимание на порядок сериализации. Если я изначально инициализировал все поля:

var r = (from ...... select new SomeSample { A = 1, B = 2, C = 3 }).ToList();

объект был сериализован в правильном порядке.

Я должен добавить, что в обоих случаях отладчик показывает абсолютно одинаковое содержимое переменной "r".

Я схожу с ума или это нормальное поведение?

Заранее спасибо.

1 Ответ

0 голосов
/ 02 июня 2010

Это странно, но на самом деле это нормальное поведение. К счастью, есть атрибут, который можно обойти. Вы можете установить порядок сериализации свойств, используя атрибут DataMember(Order = x): http://msdn.microsoft.com/en-us/library/ms729813.aspx

[Serializable]
[DataContract]
public class SomeSample
{
    [DataMember(Order = 0)]
    public int A;
    [DataMember(Order = 1)]
    public int B;
    [DataMember(Order = 2)]
    public int C;
}
...