Сериализация WCF и наследование IEnumerable‹T› против ICollection‹T›

Мне известно о проблеме при создании пользовательских коллекций, наследуемых от List<T> или ICollection<T> с дополнительными пользовательскими свойствами:

public class MyCollection: List<int>
{
    public string MyCustomProperty { get; set; }
}

Насколько я знаю, такая коллекция будет передана WCF как ArrayOfInt, и WCF не будет сериализовать мое пользовательское свойство. Решение состоит в том, чтобы создать класс-оболочку, который будет управлять коллекцией внутри и будет иметь настраиваемое свойство.

Я хочу сделать более удобный обходной путь для своих нужд... у IEnumerable<T> будет такая же проблема?

public class MyCollection: IEnumerable<int>
{
   /**************/
   /* Code that implements IEnumerable<int> and manages the internal List<T> */
   /* I know I will not able to cast it to List<T>, but I don't need it.  */
   /* If I will need it, I will implement cast operators later */
   /**************/

   public string MyCustomProperty { get; set; }
}

Будет ли указанный выше класс pass throw WCF включать значение MyCustomProperty?

Спасибо


person Alex Dn    schedule 26.06.2013    source источник


Ответы (1)


Я пробовал, и он не сериализует пользовательское свойство. Я только что вернул весь объект класса из метода службы. Результат по-прежнему ArrayOfInt (я использовал список в качестве контейнера)

public class MyExtension: IEnumerable<int>
{
    public string CustomString { get; set; }
    private List<int> lst = new List<int>(); 

    public void Add(int i)
    {
        lst.Add(i);
    }

    public IEnumerator<int> GetEnumerator()
    {
        return lst.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return lst.GetEnumerator();
    }
}

Мне пришлось пометить его как DataContract и каждый элемент как DataMember, чтобы все свойства были сериализованы.

<MyExtension xmlns="http://schemas.datacontract.org/2004/07/GetRequestTest"     xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
 <CustomString>sunny</CustomString> 
 <lst xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <a:int>1</a:int> 
 </lst>
</MyExtension>
person vibhu    schedule 27.06.2013
comment
Но после того, как вы пометили его как DataMember, он возвращает пользовательское свойство, поэтому это решение, поскольку с ICollection свойство не проходит, даже если оно помечено как DataMember. - person Alex Dn; 27.06.2013
comment
Кстати, я думаю, что обнаружил, что если класс будет помечен как Serializable, а не DataContract, он будет работать с ICollection и даже с ним, но я еще не проверял это хорошо. - person Alex Dn; 27.06.2013
comment
И я полагаю, что вы создаете свойство для List‹T›, чтобы иметь возможность пометить его DataMember, поскольку частные поля не сериализуются с помощью DataContract. Или я ошибаюсь? - person Alex Dn; 27.06.2013
comment
частные поля сериализуются с помощью атрибута DataMember. И да, вы можете выполнить сериализацию через атрибут Serializable, но я думаю, что DataContract быстрее. Пожалуйста. обратитесь к этому сообщению - stackoverflow.com/questions/4792269/ - person vibhu; 27.06.2013