2008-11-18 9 views
4

J'ai une classe simple dans mon service WCF qui ne semble pas apparaître correctement pour le client qui accède à mon WCF.constructeur n'apparaissant pas dans mon client WCF, problème de sérialisation?

Ma classe a 4 propriétés publiques qui sont de type string.

J'ai marqué la classe avec [DataContract()] et chaque membre avec [DataMember].

Pourquoi mon constructeur n'est-il pas visible? Y a-t-il un [attribut] spécial pour les constructeurs?

Répondre

0

Les parenthèses ne sont pas obligatoires lorsque vous marquez une classe comme un contrat de données. Pouvez-vous fournir un échantillon de code de votre classe?

8

Les contrats de données n'ont rien à voir avec les constructeurs. Ainsi, lorsque vous créez votre proxy sur le client, vous obtiendrez uniquement une classe qui implémente le contrat de données.

Si vous souhaitez ajouter un constructeur similaire sur le côté client (en supposant que le type généré est nommé SomeDataItem), vous pouvez l'ajouter en utilisant une classe partielle:

public partial class SomeDataItem 
{ 
    public SomeDataItem(int a, int b) 
    { 
     A = a; 
     B = b; 
    } 
} 
+0

J'aime votre suggestion .... + 1 –

1

Comment vous générez votre code client: VS Ajouter une référence de service, SVCUTIL? Quels paramètres/paramètres utilisez-vous? Avez-vous regardé le code client pour voir ce qui est en train d'être créé?

Votre classe est-elle utilisée correctement dans le service? J'ai rencontré un problème lorsque j'ai créé une classe de contrat de données exposée mais que je ne l'utilisais pas dans une méthode de service, de sorte que la classe n'était pas exportée dans le code client.

6

Convenir que vous pouvez ajouter une classe partielle à l'application côté client WCF - vous pouvez également ajouter [OnDeserializing] et [OnDeserialized] méthodes de la classe côté serveur pour gérer initialisations, etc.

Trouvé ce qui suit excellent exemple quand je cherchais sur la façon de traiter cette chose - à http://social.msdn.microsoft.com/forums/en-US/wcf/thread/447149d5-b44c-47cd-a690-20928244b52b/

[DataContract] 
public class MyClassWithSpecialInitialization 
{ 
    List<string> myList; 
    string str1; 
    [DataMember] 
    public string Str1 
    { 
     get { return str1; } 
     set 
     { 
      this.myList.Add(value); 
      str1 = value; 
     } 
    } 
    string str2; 
    [DataMember] 
    public string Str2 
    { 
     get { return str2; } 
     set 
     { 
      this.myList.Add(value); 
      str2 = value; 
     } 
    } 
    public MyClassWithSpecialInitialization() 
    { 
     this.myList = new List<string>(); 
    } 
    [OnDeserializing] 
    public void OnDeserializing(StreamingContext context) 
    { 
     Console.WriteLine("Before deserializing the fields"); 
     this.myList = new List<string>(); 
    } 
    [OnDeserialized] 
    public void OnDeserialized(StreamingContext context) 
    { 
     Console.WriteLine("After deserializing the fields... myList should be populated with the values of str1 and str2"); 
    } 
}