Взгляните на это:
>>> 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>
Здесь есть старая ветка:
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/a891928b-d27a-4ef2-83b3 -ee407c6b9187
Похоже, единственный вариант - поменять местами сериализатор, но затем он становится опцией, что еще более раздражает.
Редактировать: вы можете написать свой собственный сериализатор, чтобы изменить порядок элементов, а затем передать его DataContractSerializer
.
Вы можете указать порядок сериализации путем декорирования элементов в вашем контракте данных:
[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 поменялись местами, они не должны '
Вы можете использовать свойство 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.