IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

serveur / client et classe sérializable


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Par défaut serveur / client et classe sérializable
    Bonjour,

    j'ai un serveur qui distribue un objet SharedObject qui a comme attribut un objet sérializable SerializableObject.

    Le client récupère cet objet distribué et appele une méthode sur celui-ci afin de récupérer l'attribut.

    Et là, erreur de cast sur la valeur de retour :
    mono Client.exe
    Deserialization...

    Unhandled Exception: System.InvalidCastException: Return value has an invalid type
    at System.Runtime.Remoting.Proxies.RealProxy.ProcessResponse (IMethodReturnMessage mrm, System.Runtime.Remoting.Messaging.MonoMethodMessage call) [0x00000] in <filename unknown>:0
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (System.Runtime.Remoting.Proxies.RealProxy rp, IMessage msg, System.Exception& exc, System.Object[]& out_args) [0x00000] in <filename unknown>:0
    make: *** [run-client] Error 1
    Je ne comprends pas pourquoi le client ne parvient pas à récupérer l'objet sérializé...

    Une idée?

    Merci.

    Le code :

    Server.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    using System; // for the Console class
    using System.Runtime.Remoting; // for the RemoteConfiguration class
    using System.Runtime.Remoting.Channels; // for the ChannelServices class
    using System.Runtime.Remoting.Channels.Tcp; // for the TcpChannel class
    namespace Sample
    {
    	public class Server
    	{
    		public static void Main()
    		{
    			TcpChannel tcpChannel = new TcpChannel(8089);
    			ChannelServices.RegisterChannel(tcpChannel, false);
    			RemotingConfiguration.RegisterWellKnownServiceType(typeof(SharedObject), "SharedObject", WellKnownObjectMode.Singleton);
    			Console.WriteLine("Push <Enter> to exit...");
    			Console.ReadLine();
    		}
    	}
    }
    Client.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    using System; // for the Console and Activator classes
    using System.Runtime.Remoting.Channels; // for the ChannelServices class
    using System.Runtime.Remoting.Channels.Tcp; // for the TcpChannel class
    namespace Sample
    {
    	public class Client
    	{
    		public static void Main()
    		{
    			TcpChannel tcpChannel = new TcpChannel();
    			ChannelServices.RegisterChannel(tcpChannel, false);
    			SharedObject sharedObject = (SharedObject)Activator.GetObject(typeof(SharedObject), "tcp://localhost:8089/SharedObject");
    			sharedObject.printHello();
    			sharedObject.getSerializableObject();
    			Console.WriteLine("Push <Enter> to exit...");
    			Console.ReadLine();
    		}
    	}
    }
    SharedObject.cs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    using System; // for the Console and MarshalByRefObject classes
    namespace Sample
    {
    	public class SharedObject: MarshalByRefObject
    	{
    		private SerializableObject serializableObject;
    		public SharedObject()
    		{
    			this.serializableObject = new SerializableObject();
    		}
    		public void printHello()
    		{
    			Console.WriteLine("Hello");
    		}
    		public SerializableObject getSerializableObject()
    		{
    			return this.serializableObject;
    		}
    	}
    }
    SerializableObject
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    using System; // for the Console and MarshalByRefObject classes
    using System.Runtime.Serialization; // for the SerializationInfo and StreamingContext
    using System.Security.Permissions; // for the SecurityPermissionAttribute
    namespace Sample
    {
    	[Serializable]
    	public class SerializableObject: ISerializable
    	{
    		public SerializableObject()
    		{
    		}
    		public void printWorld()
    		{
    			Console.WriteLine("World");
    		}
    		// Déserialization
    		public SerializableObject(SerializationInfo info, StreamingContext context)
    		{
    			Console.WriteLine("Deserialization...");
    		}
    		// Sérialization
    		[SecurityPermissionAttribute(
                    SecurityAction.Demand,
                    SerializationFormatter = true)]
    		public void GetObjectData(SerializationInfo info, StreamingContext context)
    		{
    			Console.WriteLine("Serialization...");
    		}
    	}
    }

  2. #2
    Membre confirmé Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Par défaut
    Ouf! J'ai trouvé.

    Je compilais de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gmcs -pkg:dotnet Server.cs SharedObject.cs SerializableObject.cs
    gmcs -pkg:dotnet Client.cs SharedObject.cs SerializableObject.cs
    J'obtenais donc Server.exe et Client.exe.

    Alors qu'il fallait procéder ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    gmcs -pkg:dotnet -target:library SharedObject.cs SerializableObject.cs -out:Shared.dll
    gmcs -pkg:dotnet -reference:Shared.dll Server.cs
    gmcs -pkg:dotnet -reference:Shared.dll Client.cs
    J'obtiens donc Server.exe, Client.exe et Shared.dll.

    Donc mon problème n'avait rien à voir avec la sérialisation. D'ailleurs, pour parler des classes sérialisables, seule la mise en place du tag [Serializable] suffit. Inutile donc de créer les méthodes de Sérialisation/Désérialisation et d'hériter de l'interface ISerializable (comme je l'ai fait dans l'exemple précédent).

    Problème résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Réseau][Débutant]Application Serveur/Client par TCP/IP
    Par Belegkarnil dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 13/11/2005, 13h39
  2. Différence poste serveur/client au niveau hardware et OS
    Par drinkmilk dans le forum Ordinateurs
    Réponses: 5
    Dernier message: 07/04/2005, 16h43
  3. Connection Serveur Client
    Par d.w.d dans le forum C++
    Réponses: 16
    Dernier message: 21/02/2005, 11h17
  4. Serveur/Client sous linux
    Par black is beautiful dans le forum Réseau
    Réponses: 2
    Dernier message: 13/08/2004, 13h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo