mam Zespół Klasa, która przechowuje listę Generic:WCF: Serializacja i deserializacji kolekcje generyczne
[DataContract(Name = "TeamDTO", IsReference = true)]
public class Team
{
[DataMember]
private IList<Person> members = new List<Person>();
public Team()
{
Init();
}
private void Init()
{
members = new List<Person>();
}
[System.Runtime.Serialization.OnDeserializing]
protected void OnDeserializing(StreamingContext ctx)
{
Log("OnDeserializing of Team called");
Init();
if (members != null) Log(members.ToString());
}
[System.Runtime.Serialization.OnSerializing]
private void OnSerializing(StreamingContext ctx)
{
Log("OnSerializing of Team called");
if (members != null) Log(members.ToString());
}
[System.Runtime.Serialization.OnDeserialized]
protected void OnDeserialized(StreamingContext ctx)
{
Log("OnDeserialized of Team called");
if (members != null) Log(members.ToString());
}
[System.Runtime.Serialization.OnSerialized]
private void OnSerialized(StreamingContext ctx)
{
Log("OnSerialized of Team called");
Log(members.ToString());
}
Kiedy użyć tej klasy w usług WCF, mam następujący wyjściowych dziennika
OnSerializing of Team called
System.Collections.Generic.List 1[XXX.Person]
OnSerialized of Team called
System.Collections.Generic.List 1[XXX.Person]
OnDeserializing of Team called
System.Collections.Generic.List 1[XXX.Person]
OnDeserialized of Team called
XXX.Person[]
Po deserializacji jest tablicą i nie jest już ogólną listą, chociaż typem pola jest IList <> (?!) Kiedy próbuję wysłać ten obiekt z powrotem przez usługę WCF, otrzymuję komunikat wyjściowy
OnSerializing of Team called
XXX.Person[]
Po tym moja jednostka wywala test z System.ExecutionEngineException, co oznacza usługę WCF nie jest w stanie serializować tablicę. (Może dlatego, że oczekuje się IList <>)
Więc moje pytanie brzmi: Czy ktoś wie dlaczego rodzaj mojego IList <> jest tablicą po deserializacji i dlatego nie mogę serializacji mojego obiektu zespołu już po tym ?
Dzięki
Dzięki. Naprawdę ciężko jest dowiedzieć się, na co może wpłynąć "ja". W międzyczasie znalazłem inne rozwiązanie, szczególnie gdy potrzebujesz IList <> zamiast listy <> (np. Mój OR-Mapper może obsłużyć IList <>, ale nie List <>): zamiast oznaczać pole "członkowie" [ DataMember] oznaczyć właściwość i użyć tego kodu dla ustawiającego: if (value! = Null) members = new List (value); else members = new List (); Dzięki temu deserialized tablica jest przekazywana do settera, który tworzy z niego nową Listę. –
Fabiano
Ta ostatnia technika jest tym, co zawsze robię. To pole członka nie jest czymś, do czego powinien się kontaktować serializator. – IDisposable
Po drugie, podejście własności! Jestem zły, że sam o tym nie myślałem. – codechurn