У меня проблемы с использованием DataContract
s для десериализации, когда обертка списка дополняется дополнительными данными.Важная часть XML вставлена сюда, с полной ссылкой на XSD и документацией в конце этого поста.
<criteria>
<criterion>
<name>common-name</name>
<value>J350</value>
<matches>3</matches>
</criterion>
<criterion>
<name>designation</name>
<value>J350</value>
<matches>8</matches>
</criterion>
<matches>2</matches> <!-- only shows results matching all criteria -->
</criteria>
Я сейчас нахожусь в точке:
[CollectionDataContract(Namespace = "TheNamespace")]
public partial class SearchResultsCriteria : List<SearchResultsCriteriaInfo>
{
[DataMember(Name = "matches", Order = 1)] // fail
public int Matches { get; set; }
}
[DataContract(Name = "criterion", Namespace = "TheNamespace")]
public partial class SearchResultsCriteriaInfo
{
[DataMember(Name = "name", Order = 0)]
public string Name { get; set; }
[DataMember(Name = "value", Order = 1)]
public string Value { get; set; }
[DataMember(Name = "matches", Order = 2)]
public int Matches { get; set; }
// all other properties which can show up in the xml
}
Теперь проблема, когда я десериализирую это, используя DataContractSerializer
, я получаю список, как и ожидалось, только все значения для Matches
на SearchResultsCriteria
отображаются как 0. Чего мне не хватает, чтобы получитьрасширенный список для правильной десериализации? Я нашел эту статью MSDN , которая помогла мне решить некоторые другие проблемы, но не имеет ничего относительно этой конкретной проблемы.
РЕДАКТИРОВАТЬ:порядок имеет значение!
Я натолкнулся на эту другую статью MSDN о порядке элементов в XML при использовании десериализации DataContract
.Итак, из того, что я могу сказать, похоже, что проблема в том, что порядок не может быть определен, так как над критериями соответствия есть переменное число <criterion>
элементов.Я надеялся, что в этом случае я смогу указать порядок совпадений критериев равным 1, а когда был указан только один критерий, это сработало бы, потому что я мог бы справиться с этой ситуацией.Тем не менее, это не работает, когда класс указан с CollectionDataContract
, как я указал выше.
Для более конкретного контекста я пытаюсь написать служебную оболочку для thrustcurve.orgапи .