DataContractSerializer для расширенного типа списка - PullRequest
1 голос
/ 27 марта 2011

У меня проблемы с использованием 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апи .

1 Ответ

1 голос
/ 31 марта 2011

Я не уверен, что именно вы подразумеваете под "расширенными типами списков", но я предполагаю, что вы имеете в виду членов типа списка, которые не классифицируются как атрибуты DataMember, но которые, тем не менее, должны быть повернуты туда-сюда во время сериализацииprocess.

Исходя из этого понимания, вам нужен IExtensibleDataObject.http://msdn.microsoft.com/en-us/library/ms731083.aspx и http://msdn.microsoft.com/en-us/library/ms731138.aspx и http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iextensibledataobject.aspx будут хорошими отправными точками здесь.

Если я неправильно понял ваш вопрос ... извините!Пожалуйста, уточните, что вы имели в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...