Avatar billede tigertool Nybegynder
18. maj 2005 - 23:35 Der er 17 kommentarer og
1 løsning

SerializationException og Remoting

Hej,

Jeg har lavet en lille server hvor jeg benytter Remoting. På serveren er der en simpel klasse der indeholder en ArrayList samt 2 metoder. En til at tilføje til ArrayListen og en til at hente hele ArrayListen.

Når jeg forsøger at tilføje fra en Klient-applikation får jeg følgende fejl:

An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dll

Additional information: Typen WinForm.Game i assemblyen WinForm, Version=1.0.1964.40456, Culture=neutral, PublicKeyToken=null er ikke markeret til serialisering.

The program '[3004] WinForm.exe' has exited with code 0 (0x0).

Jeg er helt ny i .NET Remoting - nogen der kan hjælpe mig videre?
Avatar billede arne_v Ekspert
18. maj 2005 - 23:37 #1
[Serializable]
public class Game
Avatar billede tigertool Nybegynder
18. maj 2005 - 23:41 #2
An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dll

Additional information: Parsefejl, der er ingen assembly knyttet til XML-nøglen
Avatar billede arne_v Ekspert
18. maj 2005 - 23:44 #3
den har jeg aldrig set før
Avatar billede tigertool Nybegynder
18. maj 2005 - 23:45 #4
Hehe. Vil du have noget kode - eller evt en url til hele projectet?
Avatar billede arne_v Ekspert
18. maj 2005 - 23:47 #5
helst et 10 liniers eksempel som illusterer problemet
Avatar billede tigertool Nybegynder
18. maj 2005 - 23:50 #6
OK.

Server:
    public class Games : MarshalByRefObject, IGames
    {
        private ArrayList games = new ArrayList();
       
        public Games()
        {
        }

        public void AddGame(object game)
        {
            games.Add(game);
        }

        public ArrayList GetGames()
        {
            return games;
        }
    }

    public class Manager
    {
        [STAThread]
        public static void Main(string[] args)
        {
            IChannel channel = new HttpChannel(3999);
            ChannelServices.RegisterChannel(channel);

            RemotingConfiguration.RegisterWellKnownServiceType(typeof(Games),"Games.rem",WellKnownObjectMode.Singleton);
            Console.WriteLine("Server running - press <ENTER> to quit");
            Console.ReadLine();
        }
    }

Interface:
    public interface IGames
    {
        void AddGame(object game);
        ArrayList GetGames();
    }

Klient:
        public static void Main()
        {
            IGames games = (IGames) RemotingServices.Connect(typeof(IGames), "http://localhost:3999/Games.rem");
           
            Game g = new Game();
           
            Console.WriteLine(games.GetGames().Count);
           
            games.AddGame(g);

            Console.WriteLine(games.GetGames().Count);
        }
Avatar billede tigertool Nybegynder
18. maj 2005 - 23:51 #7
HOV.
Under klient glemte jeg lige:

    [Serializable]
    public class Game
    {
        public Game()
        {
        }
    }
Avatar billede tigertool Nybegynder
19. maj 2005 - 00:28 #8
Hvis jeg prøver:

        public static void Main()
        {
            IGames games = (IGames) RemotingServices.Connect(typeof(IGames), "http://localhost:3999/Games.rem");
         
            Game g = new Game();
         
            Console.WriteLine(games.GetGames().Count);
         
            games.AddGame("FOOBAR");

            Console.WriteLine(games.GetGames().Count);
        }

Så virker det - er der noget galt med min Game klasse?
Avatar billede burningice Nybegynder
19. maj 2005 - 07:43 #9
hvorfor har du lavet en Game-klasse under klient? Det er jo Game-klassen i server, der skal være Serializable.

I Klient har du også noget underligt noget. Hvorfor opretter du en Games-instans to gange? Først en proxy, og derefter oprette den igen normalt?
Avatar billede tigertool Nybegynder
19. maj 2005 - 13:54 #10
Bemærk at Game og Games er 2 forskellige klasser.
Avatar billede tigertool Nybegynder
19. maj 2005 - 15:42 #11
Det virker hvis jeg kopiere klassen Game over på serveren - altså hvor jeg har klassen Game liggende både på server og klient.

Kan det være fordi serveren skal kende de objekter der skal tilføjes til ArrayListen?
Avatar billede burningice Nybegynder
19. maj 2005 - 16:36 #12
hov.. det havde jeg ikke set... det med game og games... du bør kalde det for GameCollection istedet, for at følge normale namingconventions.

Ang. det andet spørgsmål, så er det nok ikke helt forkert. Du kan evt. lave et IGame-interface, så selve implementeringen kan ligge på klienten.
Avatar billede tigertool Nybegynder
19. maj 2005 - 17:02 #13
Jeg har prøvet med at lave et Interface - det giver samme problemer - desværre. Jeg lavede et IGame og placerede det på både server og klient, hvorefter jeg lod Game-klassen arve fra IGame-klassen - så burde det vil virke? Hvilket det så ikke gør!
Avatar billede burningice Nybegynder
20. maj 2005 - 11:05 #14
weird.. meget weird...
Avatar billede burningice Nybegynder
20. maj 2005 - 11:06 #15
På klienten... hvordan opretter du så dit Game-object?

Game g = new Game();

eller

IGame g = new Game();

??
Avatar billede tigertool Nybegynder
20. maj 2005 - 18:11 #16
Nå - så fandt jeg løsningen. Det er sådan at serveren skal deserialize Game-objektet, hvorfor serveren også skal kende Game-klassen. Derfor er løsningen at smide Game-klassen i en DLL således at man har den både på server og klient.

Nogen der vil have point?
Avatar billede burningice Nybegynder
20. maj 2005 - 18:28 #17
Så lærte jeg da også det... jeg ville ellers tro at det var nok at basere det hele på interfaces, så at serveren kun skulle kende til de forskellige interfaces, og ikke selve implementeringen.
Avatar billede arne_v Ekspert
20. maj 2005 - 18:33 #18
jeg tror at det er fordi at det er den "omvendte" vej

client kan godt lave en proxy klasse udfra et interface

men server kan ikke det samme

bl.a. derfor callback er så besværligt i .NET

iøvrigt tror jeg at det er normalt at have både remoting interfacet og evt.
data klasser i samme assembly som bruge af både client og server
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester