2013-06-26 3 views
0

Я знаю об этой проблеме при создании пользовательских коллекций, наследуемых от List<T> или ICollection<T> с дополнительными пользовательскими свойствами:WCF сериализация и IEnumerable <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; } 
} 

Будет ли класс выше пройденным броском WCF включать значение MyCustomProperty?

Благодаря

ответ

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> 
+0

Но после того, как вы пометили его как DataMember, оно возвращает пользовательское свойство, поэтому оно является решением, так как с ICollection свойство не проходит, даже если оно помечено как DataMember. –

+0

Кстати, я считаю, что если класс будет отмечен как Serializable, а не DataContract, он будет работать даже с ICollection, но я еще не тестировал его. –

+0

И я считаю, что вы создаете свойство для списка , чтобы иметь возможность его отмечать DataMember, поскольку частные поля не сериализованы с помощью DataContract. Или я ошибаюсь? –