Служба REST-ful WCF: десериализация списка строк C # не работает должным образом - PullRequest
1 голос
/ 24 августа 2010

У меня есть служба WCF с полным REST, которая возвращает ответ XML.Он состоит из объектов, которые сериализуются и десериализуются правильно, за одним исключением, что мое свойство List на узле неправильно десериализуется.XML выглядит следующим образом:

<ShippingGroups>
<ShippingGroup>
  <ShippingGroupId>
  b0b4d8a4-ff1f-4f02-a47c-263ef8ac861b</ShippingGroupId>
  <ShippingAddressId>
  63c0b52c-b784-4c27-a3e8-8adafba36add</ShippingAddressId>
  <LineItemIds xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <a:string>ccc0f986-52d5-453e-adca-8ff4513c1d84</a:string>
  </LineItemIds>
</ShippingGroup>

Проблема возникает из-за того, что мой класс C # для десериализации этого XML ожидает ListIllItemIds списка.Я могу обойти это, вручную удалив это пространство имен и удалив.

Есть ли другой способ обойти это так, чтобы он выглядел так:

<ShippingGroups>
<ShippingGroup>
  <ShippingGroupId>
  b0b4d8a4-ff1f-4f02-a47c-263ef8ac861b</ShippingGroupId>
  <ShippingAddressId>
  63c0b52c-b784-4c27-a3e8-8adafba36add</ShippingAddressId>
  <LineItemIds>
    <string>ccc0f986-52d5-453e-adca-8ff4513c1d84</string>
  </LineItemIds>
</ShippingGroup>

1 Ответ

1 голос
/ 25 августа 2010

Я думаю, что у меня есть ответ для вас.Не видя вашего DataContracts, я отчасти догадываюсь, что вы используете и как структурированы ваши данные.Но здесь идет ...

Я использую VS2010, C #, WCF REST и .NET 4. Для этого.

По умолчанию ваша коллекция или массив использует пространство имен по умолчанию для поддержаниясовместимость, когда он становится сериализованным.Итак, ваша сериализация ведет себя как задумано.

Обойти это можно, если создать собственную коллекцию и использовать для нее атрибут CollectionDataContract.После этого вы получаете больше контроля над тем, как он сериализуется, включая его пространство имен.Вот подробное объяснение об этом из MSDN.

Итак, я создал собственную коллекцию и использовал пространство имен CollectionDataContract как таковое:

[CollectionDataContract(Namespace="")]
public class StringItem2 : Collection<string>
{
}

Нет свойствтак как в этой коллекции будут только строки.

У меня тогда есть DataContract, в котором содержится моя пользовательская коллекция строк:

[DataContract(Namespace="", IsReference=false)]
public class SampleItem
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string StringValue { get; set; }
    [DataMember]
    public StringItem2 StringItems2 { get; set; }
}

Теперь, когда я это сделал, у меня есть простой WCFСлужба RESTful (GET):

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class Service1
{

    [WebGet(UriTemplate = "{id}")]
    public SampleItem Get(string id)
    {
        SampleItem si = new SampleItem()
        {
            Id = 10,
            StringValue = "foo",
            StringItems2 = new StringItem2() { "Hola", "como", "esta", "usted" }
        };
        return si;
    }

}

Когда я запрашиваю эту услугу (http://localhost:xxxx/Service1/10),), в ответ я получаю следующий XML:

<SampleItem xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
 <Id>10</Id> 
 <StringItems2>
  <string>Hola</string> 
  <string>como</string> 
  <string>esta</string> 
  <string>usted</string> 
 </StringItems2>
 <StringValue>foo</StringValue> 
</SampleItem>

Надеюсь, это поможет.дайте мне знать, если есть дополнительные детали, которые я пропустил, или если есть еще вопросы. Я обновлю свой ответ соответственно.

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