La WCF: la Sérialisation et la Désérialisation générique collections
J'ai une classe de l'Équipe qui détient une liste générique:
[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());
}
Quand j'ai utiliser cette classe dans un service WCF, je reçois suite à la sortie du journal
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[]
Après la désérialisation members
est un Tableau, et non plus une liste générique bien que le type de champ est IList<> (?!)
Lorsque j'essaie d'envoyer cet objet revenir sur le service WCF-je obtenir la sortie du journal
OnSerializing of Team called
XXX.Person[]
Après mon test de l'unité se bloque avec un Système.ExecutionEngineException, ce qui signifie que le service WCF est pas en mesure de sérialiser le tableau. (peut-être parce qu'il prévoyait une IList<>)
Donc, ma question est: Est-ce que quelqu'un sait pourquoi le type de mon IList<> est un tableau après la désérialisation et pourquoi je ne peux pas sérialiser mon Équipe d'objet plus longtemps après que?
Grâce
Vous devez vous connecter pour publier un commentaire.
Vous avez exécuté dans l'un des
DataContractSerializer
de pièges.Correctif: Modifier votre déclaration d'un membre de:
OU modifier la propriété de:
Et il va fonctionner. Le Microsoft Connect bug est ici
Ce problème se produit lorsque vous désérialiser un objet avec une
IList<T>
DataMember et puis essayez de sérialiser la même instance de nouveau.Si vous voulez voir quelque chose de cool:
Il permet d'imprimer
int[] is IList<int>: True
.Je soupçonne que c'est peut-être la raison pour laquelle vous voir revenir comme un tableau après la désérialisation, mais il est tout à fait intuitif.
Si vous appelez la méthode Add() sur le
IList<int>
de la matrice si, il jetteNotSupportedException
.L'un de ceux-ci .NET bizarreries.
J'ai eu ce message d'erreur lors du transport d'une IList lire à partir d'une base de données via LINQ. La WCF a été hébergé dans IIS 7 sur un ordinateur Windows Server 2008 x64.
L'application de la piscine s'est écrasé avec aucun avertissement.
Son pas exactement le même problème, mais peut avoir la même cause.
La résolution a été d'installer MS correctif KB973110 http://support.microsoft.com/kb/971030/en-us
Cela ressemble à votre service WCF de référence est la création d'une classe proxy plutôt que d'utiliser le type de données existant. Des classes Proxy ne peut utiliser de tableaux simples et pas n'importe lequel .NET des types spécifiques comme la Liste générique.
Pour éviter cette classe proxy de conversion, en Ajouter une Référence de Service de l'écran, cliquez sur le bouton Avancé, puis assurez-vous que "la Réutilisation des types dans les assemblys référencés" est cochée. Cela permettra d'assurer que la classe existante (avec le générique de la Liste) est utilisé lors de la sérialisation et la désérialisation de l'objet.
Pris directement à partir de mon blog. j'espère qu'il sera utile:
J'ai récemment rencontré un problème où nous étions de la consommation d'un service WCF et à l'aide d'un modèle de liaison personnalisé dans notre ASP.net MVC app. Tout a bien fonctionné extrait quand nous étions sérialisation de notre ILists. IList est sérialisée de tableaux par défaut. J'ai fini la conversion de nos tableaux de retour à ILists l'aide de la Réflexion et de l'appel de la méthode suivante dans le modèle de classeur. Voici comment la méthode ressemble: