2009-09-17 6 views
4

Je dispose d'un service Web qui sérialise une classe (la classe provient du service Web) dans un MSMQ, puis un service Windows vérifie la file d'attente et la désérialisation. Le service Windows a une référence Web pour obtenir la classe.Classe C# référencée à partir du service Web ne désérialisant pas correctement

Si je désérialise dans le service Web, tout va bien. Cependant, lorsque je désérialise le service Windows, tout fonctionne à l'exception de deux tableaux de chaînes qui apparaissent comme nulles, donc je crois que quelque chose ne se transfère pas correctement sur la référence Web.

Voici un extrait de la classe en question:

[Serializable, XmlInclude(typeof(EmailType))] 
public partial class Email 
{ 
[System.Xml.Serialization.XmlElement("BodyParameters")] 
public string[] BodyParameters 
{ 
    get 
    { 
     return this.bodyParameters; 
    } 
    set 
    { 
     this.bodyParameters = value; 
    } 
} 

[System.Xml.Serialization.XmlElement("SubjectParameters")] 
public string[] SubjectParameters 
{ 
    get 
    { 
     return this.subjectParameters; 
    } 
    set 
    { 
     this.subjectParameters = value; 
    } 
} 
} 

Le fichier Reference.cs je reçois dans mon service Windows ressemble à ceci:

/// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("BodyParameters")] 
    public string[] BodyParameters { 
     get { 
      return this.bodyParametersField; 
     } 
     set { 
      this.bodyParametersField = value; 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("SubjectParameters")] 
    public string[] SubjectParameters { 
     get { 
      return this.subjectParametersField; 
     } 
     set { 
      this.subjectParametersField = value; 
     } 
    } 

Y at-il une manière particulière, je dois référencer la classe ou configurer la chaîne [] dans la classe pour qu'elle soit correctement référencée?

est ici la sortie que je reçois si je sérialiser un fichier:

<?xml version="1.0" encoding="utf-8"?> 
<Email xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" MessageType="None" PackageID="0"  To="[email protected]" Subject="testing..." Body="this is a test" IsHTML="false"> 
    <BodyParameters>one two</BodyParameters> 
    <BodyParameters>three four</BodyParameters> 
    <BodyParameters>test test</BodyParameters> 
    <SubjectParameters>foo</SubjectParameters> 
</Email> 

Gardez à l'esprit, tout sauf BodyParameters et SubjectParameters sort bien dans le service Windows. Service Web, tout fonctionne.

+0

Suggestion: supprimer l'attribut '[Serializable]', comme il est pas utilisé par sérialisation XML. Ensuite, effectuez une sérialisation dans un fichier et publiez le fichier afin que nous puissions voir le format du fichier XML. –

+0

Autre suggestion: DRY: utilisez la même bibliothèque de classes pour la sérialisation/désérialisation de vos projets. – jro

Répondre

1

J'ai couru il y a quelques années lors du développement d'une application multi-tiers. J'espère que votre situation est la même que la mienne, alors ce sera utile. Notre configuration était que nous avions un serveur dédié à seulement servir des services Web pour transmettre des données entre tous les autres composants.

Les classes ont été définies dans le projet de service Web. Exemple:

<Serializable()> _ 
Public Class RetailInformation_StoreInformation 
... 
End Class 

Lorsque nous avions une classe de client, essayez de désérialiser les données sérialisées, nous ne pouvions pas le faire. Nous avons essayé de copier la DLL qui contenait la classe RetailInformation_StoreInformation dans les applications clientes, mais cela ne désérialiserait pas.

Ce que nous avons découvert était finalement ce ..

Disons que nous avons une application client nommé StoreInfoDisplayApp

Dans le projet StoreInfoDisplayApp, nous avons ajouté une référence Web au service Web nommé RetailInfoService.

Nous avons constaté que nous ne pouvions pas désérialiser RetailInformation_StoreInformation de la dll comme ceci:

Private Function DeSerializeStoreInfo(ByVal path As String) As RetailInformation_StoreInformation 
     Dim ser As New System.Xml.Serialization.XmlSerializer(GetType(RetailInformation_StoreInformation)) 
     Dim reader As System.IO.Stream = File.OpenRead(path) 
     Dim returnvalue As RetailInformation_StoreInformation = CType(ser.Deserialize(reader), RetailInformation_StoreInformation) 
     reader.Close() 
     Return returnvalue 
    End Function 

parce que le compilateur (ou le moteur d'exécution - la mémoire est floue) regardé cela comme un StoreInfoDisplayApp.RetailInformation_StoreInformation

Au lieu de cela, nous avons dû changer toutes les instances de

RetailInformation_StoreInformation

à

RetailInfoService.RetailInformation_StoreInformation

pour spécifier que le type que nous désérialisions était le même type servi par le service Web. Alors ça a marché comme une pêche!

+0

Eh bien, je ne fais que référencer le service web, pas un DLL. Et comme je l'ai dit, d'autres champs sont désérialisés, mais pas la chaîne [] – Luke

1

Vous devez mettre [XmlArray] sur la propriété SubjectParameters comme celui-ci


    [System.Xml.Serialization.XmlArrayAttribute(ElementName="SubjectParameters")] 
    public string[] SubjectParameters { 
     get { 
      return this.subjectParametersField; 
     } 
     set { 
      this.subjectParametersField = value; 
     } 
    } 
+0

Je l'ai essayé de cette façon aussi, sans aucune chance. – Luke

Questions connexes