2010-08-26 5 views
2

J'ai un objet, appelons-le UnSerializableObject, que je ne peux pas modifier et que j'ai besoin de sérialiser. J'ai donc créé mon propre objet appelé SerializableObject qui est sérialisable et contient toutes les mêmes données que l'objet original. qui ressemble à quelque chose comme ceci:Disparité de type de sérialisation WCF

namespace test 
[Serializable] 
class SerializableObject 
{ 
    private int item1; 
    public int Item1 
    { 
     get; 
     set; 
    } 
    public SerializableObject() 
    {} 
} 

Ensuite, je créé une autre classe qui convertit et d'un SerializableObject et un UnSerializableObject. du côté du service tout fonctionne bien. La méthode dans le service prend un SerializableObject en tant que paramètre et je le convertis en UnSerializableObject. Le problème est du côté du client. J'ai utilisé svcutil pour créer le code client. Ensuite, je prends un objet le convertir en SerializableObject et j'utilise SerializableObject dans l'appel de service. Comme ceci:

TTSServiceClient aClient = new TTSServiceClient(); 
     UnSerializableObject loMMessage = new MostMessage(); 
     SerializableObject loSMMessage = ObjectConverter.ToSerializableObject(loMMessage); 
     aClient.Allocate_OnStartResultAck(loSMMessage); 

Quand je compilez le client je reçois l'erreur:

Erreur 59 Argument '1': ne peut pas convertir « test.Utilities.SerializableObject [c: \ Projects \ Client \ Client \ test.Utilities.dll] » à 'test.Utilities.SerializableObject [C: \ Projects \ client \ client \ Service.cs (19)]'

static Class ObjectConverter 
{ 
    static public SerializableObject ToSerializableObject(UnSerializableObject usObject) 
    { 
     SerializableObject sObject = new SerializableObject(); 
     sObject.Item1 = usObject.Item1; 
     return sObject; 
    } 
} 

pourquoi est-ce qui se passe? et comment puis-je le réparer? Y a-t-il une meilleure façon de gérer cela?

+0

Pouvez-vous publier le prototype de la méthode ObjectConverter.ToSerializableObject? –

+0

Je l'ai ajouté. il y a beaucoup plus de propriétés mais c'est fondamentalement ça. – scott

Répondre

0

Lorsque vous ajoutez référence de service par défaut crée nouvel objet avec la même structure dans l'espace de votre référence de service. Si vous souhaitez utiliser un convertisseur partagé, vous devez également partager l'objet et le réutiliser pendant le référencement.

Btw. WCF prend en charge l'infrastructure pour l'encapsulation des objets unserializable. Vérifiez IDataContractSuroggate.

+0

Pourriez-vous fournir plus d'informations sur le convertisseur partagé ou pointer vers des ressources pour plus d'informations? Je n'ai pas pu trouver. Merci d'avance. – rpattabi

0

Veuillez vous assurer que votre client et votre serveur font tous deux référence au projet commun, qui contient la définition de votre classe SerializableObject. De plus, marquez votre classe comme ci-dessous:

[Serializable] 
[DataContract()] 
class SerializableObject 
{ 
    [DataMember()] 
    public int Item1 
    { 
     get; 
     set; 
    } 

    public SerializableObject() 
    {} 
} 
+0

qui n'a pas fonctionné. Je reçois les données que je veux maintenant, ce qui aide. mais j'ai toujours la même erreur. – scott

1

J'ai dû réécrire ma méthode de conversion côté client et supprimer les références à test.utilities.dll. donc essentiellement ce

TTSServiceClient aClient = new TTSServiceClient(); 
UnSerializableObject loMMessage = new MostMessage(); 
SerializableObject loSMMessage = ObjectConverter.ToSerializableObject(loMMessage); 
aClient.Allocate_OnStartResultAck(loSMMessage); 

est devenu

TTSServiceClient aClient = new TTSServiceClient(); 
UnSerializableObject loMMessage = new MostMessage(); 
SerializableObject loSMMessage = new SerializableObject(); 
loSMMessage.Item1 = loMMessage.Item1; 
aClient.Allocate_OnStartResultAck(loSMMessage); 

qui est un peu ennuyeux, mais cela fonctionne.

Questions connexes