Serialization eller remoting fejl ?
Jeg er ved at lege med at sende objekter over netværket, og så vidt jeg har læst mig skal der bruges serialization. Jeg har en server og en klient, de fungerer fint så længe det er strings og ArrayList (i hvertfald hvis jeg manuelt smider noget i arraylisten), ingen problemer med at returnere noget af det. Problemet opstår på klienten når den kalder en metode på serveren der skal returnere en ArrayList. Serveren skal kontakte andre klasser der skal generere denne ArrayList ud fra et XML dokument, min server metode skal så bare returnere den til klienten. Når jeg forsøger at gøre dette laver den fejl og siger at den ikke kan finde assemblien CollaborationServer (det er mit namespace på serveren??) Hvorfor vil den ikke det? problemet er helt klart isoleret til sidste linie i funktionen på server.cs (markeret med ***)Server.cs:
using System;
using System.Windows.Forms;
using System.Collections;
using GeneralInterface;
using System.Diagnostics;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels ;
using System.Runtime.Remoting.Channels.Tcp;
namespace CollaborationServer
{
/// <summary>
/// Summary description for Server.
/// </summary>
public class Server : MarshalByRefObject, GeneralInformation
{
ListBox liste= new ListBox();
public Server(ListBox minListe)
{
liste=minListe;
liste.Items.Add(DateTime.Now.ToString()+"\tInvoking server...");
}
public Server()
{
}
public ArrayList getAvailableModules()
{
liste.Items.Add(DateTime.Now.ToString()+"\tQuerying modules");
XMLAdministrator xmladmin=new XMLAdministrator();
//ArrayList myliste=xmladmin.ProcessXML();
ArrayList myliste=new ArrayList();
myliste=xmladmin.ProcessXML();
liste.Items.Add(DateTime.Now.ToString()+"\tModules ready for beam");
return myliste; //**********HER ER FEJL
}
public string getServerVersion()
{
RegistrationReader rr=new RegistrationReader();
return rr.readMajorVersionNumber()+"-"+rr.readMinorVersionNumber();
}
public bool startServer()
{
try
{
TcpServerChannel tsc = new TcpServerChannel(8228);
ChannelServices.RegisterChannel(tsc);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(Server)
, "Server" , WellKnownObjectMode.Singleton);
return true;
}
catch(Exception e)
{
liste.Items.Add(DateTime.Now.ToString()+"\tFailure: "+e);
return false;
}
}
}
}
XMLAdministrator.cs:
using System;
using System.Xml;
using System.Collections;
namespace CollaborationServer
{
/// <summary>
/// Summary description for ConfigReader.
/// </summary>
public class XMLAdministrator
{
public XMLAdministrator()
{
//
// TODO: Add constructor logic here
//
}
public ArrayList ProcessXML()
{
ArrayList minListe=new ArrayList();
XmlDocument doc = new XmlDocument( );
doc.Load("Modules.xml");
XmlNodeList fnames = doc.GetElementsByTagName("Name");
XmlNodeList lnames = doc.GetElementsByTagName("Description");
XmlNodeList enabled = doc.GetElementsByTagName("Enabled");
XmlNodeList code = doc.GetElementsByTagName("Code");
for ( int i = 0; i < fnames.Count; ++i )
{
ModuleDescription md=new ModuleDescription(fnames[i].InnerText, lnames[i].InnerText, enabled[i].InnerText, code[i].InnerText);
minListe.Add(md);
}
return minListe;
}
}
}
min klient:
...
private void button1_Click_1(object sender, System.EventArgs e)
{
ChannelServices.RegisterChannel( new TcpClientChannel());
generalint = (GeneralInformation)Activator.GetObject(typeof(GeneralInformation)
, "tcp://localhost:8228/Server");
if ( generalint == null )
{
textBox1.AppendText("TCP SERVER OFFLINE ...PLEASE TRY LATER");
return ;
}
textBox1.Text=generalint.getServerVersion();
ArrayList moduler=generalint.getAvailableModules();
if(moduler==null)
{
textBox1.AppendText("\r\nModuler er null");
}
else
{
textBox1.AppendText("\r\nModuler er ikke null");
}
}
...
Objekterne i arraylisten er af typen ModuleDescription:
using System;
namespace CollaborationTool
{
/// <summary>
/// Summary description for ModuleDescription.
/// </summary>
[Serializable]
public class ModuleDescription
{
private string ModName;
private string ModDesc;
private string ModEnabled;
private string ModCode;
public ModuleDescription()
{
}
public ModuleDescription(string newName, string newDescription, string newEnabled, string newCode)
{
ModName=newName;
ModDesc=newDescription;
ModEnabled=newEnabled;
ModCode=newCode;
}
public string ModuleName
{
get { return ModName; }
set { ModName=value; }
}
public string ModuleDesc
{
get { return ModDesc; }
set { ModDesc=value; }
}
public string ModuleEnabled
{
get {return ModEnabled;}
set {ModEnabled=value;}
}
public string ModuleCode
{
get { return ModCode;}
set { ModCode=value;}
}
}
}
Håber der er nogle der kan hjælpe mig med det her
