Da klasser er objekter ligesom f.eks. ADODB.recordset, skal du også behandle dem som sådan. Dvs. en tildeling af et objekt til en anden variabel (f.eks. en session-variabel), skal også benytte Set:
Set myPerson = new Person myPerson.SetName = "Mr. John Doe" Set session("mytest") = myPerson ' --- DEN MELDER IKKE FEJL MERE Set myPerson = Nothing response.write "myPerson is: " & session("mytest")
Dog vil jeg ikke anbefale at du lægger objekter i session (det er mere en mavefornemmelse end en egentlig erfaringsmæssig betragtning). Du skal nok overveje om objektets egenskaber ikke skal gemmes i et andet format (f.eks. kommasepareret eller i XML-format).
En anden ting jeg bemærker, er din brug af properties. Det er meget mere intuitivt, hvis du skriver således:
public property get Name: Name = pName: end property public property let Name(value): pName = value: end property
Når jeg skriver "Da klasser er objekter ligesom..." mener jeg naturligvis at "Da instanser af klasser er objekter ligesom..." :-)
Bort set fra det, så ville jeg nok lave serialiseringen som en metode på klassen, således den bare får en nøgle, hvormed objektet kan deserialisere objektet igen, når det skal bruges (det du gør med at putte objektet i en session, kvalificerer sig vist i øvrigt ikke som en serialisering, da du ikke nedlægger objektet mellem serialisering og deserialisering, men bar gemmer en reference til objektet i session-objektet).
Eksempelvis:
class CTest private m_id private m_navn private m_email
public function serialize() dim tmp, token token = userid & "_CTest_" & m_id tmp = m_id & "|" & m_navn & "|" & m_email application(token) = tmp serialize = token end function
public sub deserialize(token) dim tmp, arr tmp = application(token) arr = split(tmp,"|") m_id = arr(0) m_name = arr(1) m_email = arr(2) end sub
public property get Id: Id = m_id: end property public property let Id(value): m_id = value: end property
public property get Name: Name = m_name: end property public property let Name(value): m_name = value: end property
public property get Email: Email = m_email: end property public property let Email(value): m_email = value: end property end class
(hvor userid er en global variabel der gør objektet lokalt for denne bruger - det mindsker risikoen for at komme til at overskrive objektets data).
Derefter bruges klassen således:
set t = new CTest t.Id = 1 t.Name = "John" t.Email = "john@doe.com" session("testobjekt") = t.serialize()
og aflæses igen senere således:
set t = new CTest call t.deserialize(session("testobjekt")) response.write t.Id & ", " & t.Name & ", " & t.Email & "<br>"
Det var da utroligt hvor meget forskel sådan et lille ord kan gøre.. :)
Et hint fra IIS ville have været nice.
Angående GetName og SetName.. Yes, I know.. det var bare for at gøre det helt klart hvad der er hvad.. og for at være sikker på at det virker i ASP (forskellige navne burde udelukke fejl i navngivningen).. Jeg bruger normalt variabelnavnet begge steder når jeg programmerer i C#..
softspot, smid et svar.. helt klart hele 60 points værd.
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.