Avatar billede akempff Nybegynder
18. juli 2004 - 22:38 Der er 19 kommentarer og
2 løsninger

Serialize nedarvet usercontrol

Hej eksperter.
Jeg har lavet min egen usercontrol og vil gerne gøre det muligt at gemme objektet nemt, som f.eks. vha serialize.

Problemet er at jeg får fejl "usercontrol not marked as serializable."

Så kort sagt:  Nogen ideer til hvordan man får sin hjemmelavede usercontrol til at være serializable?
Avatar billede arne_v Ekspert
18. juli 2004 - 22:42 #1
Har du en

[Serializable]

attribut på den ?
Avatar billede snepnet Nybegynder
18. juli 2004 - 22:48 #2
Hej akempff.

Fejlmeldingen "not marked as serializable" kommer sansynligvis fordi du ikke har sat attributten ind over klassen.
Du skriver bare nedenstående :
[Serializable()]

Men kan du ikke forklare lidt nærmere hvad det præcis er du ønsker at gemme - jeg er ikke helt med på den med at gemme en usercontrol.
Avatar billede snepnet Nybegynder
18. juli 2004 - 22:49 #3
Hov... sorry arne - gammelt vinue.
Avatar billede grantgreen Nybegynder
18. juli 2004 - 22:52 #4
Hej
Har selv rodet med samme problem, dog ikke en usercontrol men en System.Control og fandt ikke en løsning til direkte  at serialisere objekter af typen windows.forms. Så var nød til at gøre det ad andre omveje.
Avatar billede akempff Nybegynder
18. juli 2004 - 23:31 #5
Arne og snepnet [Serializable()] og [Serializable] virker fint med alle andre klasser jeg har forsøgt med, med undtagelse af min usercontrol.

grantgreen du løste det bare manuelt istedet (altså ved at dele det op i dele osv)?

snepnet, det er fordi jeg i min main form, har et tabsheet hvor jeg loader disse udercontrols (der er til tegning og manipulering af diverse elementer) Dvs der er en hel liste picture boxe, samt en samling dataelementer til hver usercontrol.
Det ville være så meget nemmere for mig, hvis jeg bare kunne gemme hele usercontrol listen binært og smide dem ind end jeg skal sidde og opbygge en ny usercontrol (tegnebræt) med infoen fra datalaget, som jeg godt kan få til at serialize.

Det ville jo have været så smart.
Avatar billede akempff Nybegynder
18. juli 2004 - 23:35 #6
Hov for lige at være hel sikker.....jeg har siddet tidligere på dagen og ledt på nettet og fandt både eksempler med
[serializable()]
public class foo

og
[serializable]
public class foo

jeg vil bare lige være sikker på, at det var det du mente Arne, med en serializble attribut.
Avatar billede snepnet Nybegynder
18. juli 2004 - 23:40 #7
Jeg tror det er ligemeget om du skriver det med eller uden ()... Du får default-constructoren under alle omstændigheder, men det skal være et stort "S".
Avatar billede akempff Nybegynder
19. juli 2004 - 00:05 #8
Hmmm...det kan godt se ud som om det slet ikke kan lade sig gøre.

fra http://www.csharp-station.com/ShowPost.aspx?PostID=5101

"Because a Windows Form holds handles to unmanaged OS Windows, you can't perform serialization with the [Serializable] attribute. Instead, you should look at the ISerializable interface....."
Avatar billede snepnet Nybegynder
19. juli 2004 - 00:19 #9
Nu har du aldrig skrevet hvad det præcis er du har behov for at gemme, så jeg er stadig lidt i tvivl, men jeg kan heller ikke rigtig forestille mig andet end at du kommer til at skrive noget omkring det selv. Det er jo bare et spørgsmål om mængden :o)

Attributten skal så vidt jeg ved være angivet selvom du selv implementerer ISerializable selv.
Avatar billede akempff Nybegynder
19. juli 2004 - 00:29 #10
Ja det ser ud til det. Work work work :)

Bare lige for forståelsens skyld, får jeg ikke et problem med multibel arv når der både skal nedarves fra usercontrol og : ISerializable?

Eller har jeg helt misforstået hvordan man implementerer ISerializable?
Avatar billede snepnet Nybegynder
19. juli 2004 - 00:34 #11
Du nedarver fra en klasse, og implementerer et interface.
Det er to forskellige ting, så der er ikke tale om multibel arv.
Avatar billede snepnet Nybegynder
19. juli 2004 - 00:36 #12
et interface er f.eks. defineret som :

public interface ISomeInterface
{
    public int SomeNumber
    {
        get;
        set;
    }
}

Det er altså bare en slags beskrivelse af krav til klassen hvis den implementerer interfacet.
Avatar billede snepnet Nybegynder
19. juli 2004 - 00:37 #13
Kompileren hjælper dig så bare med at huske at "udfylde hullerne" om du vil.
Avatar billede arne_v Ekspert
19. juli 2004 - 07:45 #14
Hvis dit objekt indeholder noget unserializable så kan det naturligvis ikke
serialiseres.

Og en windows form kan af indlysende årsager ikke serialiseres.
Avatar billede arne_v Ekspert
19. juli 2004 - 07:48 #15
C# understøtter faktisk multipel arv, men det understøtter ikke multipel
implementations arv.

Du kan arve implementation fra en klasse, men du kan arve fra mange interfaces
(som er en klasse med ene abstrakte metoder).
Avatar billede snepnet Nybegynder
19. juli 2004 - 11:04 #16
arne>>

Hehe :o) - det tror jeg godt vi kunne få nogle linier til at gå med, men jeg synes ikke det hører til her.
Du kan jo oprette en 0-pointsag - så kan vi vende den der hvis du har lyst.

Mvh
Avatar billede akempff Nybegynder
19. juli 2004 - 11:49 #17
Dette her er egentlig bare for forståelsen skyld, da vi jo har fastslået at man ikke
kan serialize forms.
Men hvordan gør gør man det rent praktisk hvis man skal nedarve interfacet? Hvis jeg har klasse erklæringen noget alla  public class myUserControl : System.Windows.Forms.UserControl

Hvordan ville man så inkludere ISerializable interfacet, alle de eksempler jeg har set er det med public class myclass : ISerializable, men hvordan får man fra flere?


Men i skal ihvertfald have tak for hjælpen
og I må meget gerne begge lægge et svar.
Avatar billede snepnet Nybegynder
19. juli 2004 - 11:51 #18
du sætter bare et komma imellem.

altså :

public class SomeClass : UserControl, ISerializable
Avatar billede snepnet Nybegynder
19. juli 2004 - 11:54 #19
Og du kan godt får et svar... Bare du venter med at acceptere til arne også har svaret :o)

Mvh - og held og lykke med det.
Avatar billede akempff Nybegynder
19. juli 2004 - 11:55 #20
Det var jo dejligt nemt. Godt så. :)

Tak, så mangler du bare at lægge et svar og Arne ligeså.
Avatar billede arne_v Ekspert
19. juli 2004 - 12:04 #21
svar
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

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