WCF Отключить чувствительность порядка десериализации

Взгляните на это:

>>> a = 256
>>> b = 256
>>> id(a)
9987148
>>> id(b)
9987148
>>> a = 257
>>> b = 257
>>> id(a)
11662816
>>> id(b)
11662828

EDIT: Вот что я нашел в документации Python 2, «Plain Integer Objects» (То же самое для Python 3 ):

Текущая реализация хранит массив целых объектов для всех целых чисел от -5 до 256, когда вы создаете int в этом диапазоне, на котором вы просто возвращаетесь ссылку на существующий объект. Поэтому должно быть возможно изменить значение 1. Я подозреваю, что поведение Python в этом случае не определено. : -)

blockquote>

30
задан 13 November 2009 в 07:24
поделиться

3 ответа

Здесь есть старая ветка:

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/a891928b-d27a-4ef2-83b3 -ee407c6b9187

Похоже, единственный вариант - поменять местами сериализатор, но затем он становится опцией, что еще более раздражает.

Редактировать: вы можете написать свой собственный сериализатор, чтобы изменить порядок элементов, а затем передать его DataContractSerializer .

7
ответ дан 28 November 2019 в 00:21
поделиться

Вы можете указать порядок сериализации путем декорирования элементов в вашем контракте данных:

[DataContract]
public class Foo 
{ 
  [DataMember(Order=1)]
  public int ID { get; set; } 

  [DataMember(Order=2)]
  public int Bar { get; set; } 
}

Таким образом, вы можете убедиться, что порядок сериализации всегда один и тот же. Но нет способа указать десериализатору «забыть» о порядке - суть в том, что это обрабатывается с помощью схемы XML и выполняется с помощью элемента - и что подразумевает и требует порядка. Боюсь, вы не можете просто отключить это.

На основе этой схемы XML ваши клиенты, не работающие с .NET, должны иметь возможность проверить, соответствует ли их XML, который они собираются отправить, этой схеме - и если это не так, потому что панель и элемент ID поменялись местами, они не должны '

12
ответ дан 28 November 2019 в 00:21
поделиться

Вы можете использовать свойство IsRequired атрибута DataMember, чтобы указать, что элементы являются обязательными. Таким образом, вместо получения «таинственного» нулевого значения вы получите более явное сообщение об ошибке, указывающее на отсутствие необходимого элемента.

[DataContract]
public class Foo 
{ 
  [DataMember(IsRequired=true, Order=1)]
  public int ID { get; set; } 

  [DataMember(IsRequired=true, Order=2)]
  public int Bar { get; set; } 
}

В вашем случае происходит следующее:

  • DataContract ожидает элементы Bar и ID в этом порядке (в алфавитном порядке, потому что вы не указали явный порядок).

  • Он встречает элемент ID без предшествующего элемента Bar. Поскольку Bar не требуется, он просто игнорирует его.

  • Элемент ID, следующий за Bar, игнорируется, потому что он находится в неправильной позиции.

Сказав это, установка IsRequired в true поможет только в версии 1 вашего контракта. Элементы, добавленные в последующих версиях, обычно имеют для IsRequired значение false.

10
ответ дан 28 November 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: