Avatar billede thesurfer Nybegynder
23. februar 2009 - 14:25 Der er 4 kommentarer og
1 løsning

Objekt, gem instans af klasse i session, serializable, serialisering i ASP

Hej Folkens.

Jeg sidder og eksperimenterer med OOP i ASP.

Når jeg prøver på at gemme selve objektet i en session, så jeg kan tilgå den senere, går det galt.

Men jeg kan godt få lov til at gemme simple typer som strenge osv..


Koden jeg bruger:


<%


Class Person

    Private pName


    Private Sub Class_Initialize()    : End Sub
    Private Sub Class_Terminate()    : End Sub

    Public Property Get GetName()                        : GetName = pName: End Property
    Public Property Let SetName(newName)                : pName = newName: End Property

End Class





Set myPerson = new Person

myPerson.SetName = "Mr. John Doe"

session("mytest") = myPerson ' --- DEN MELDER FEJL HER

Set myPerson = Nothing

response.write "myPerson is: " & session("mytest")

%>


Hvis jeg prøver på at gemme objektet myPerson i en session,
får jeg fejl i linien: session("mytest") = myPerson


Fejlen ses her:


Session object error 'ASP 0185 : 80020003'

Missing Default Property

/lyngenaturgoedningdk/test.asp, line 28

A default property was not found for the object.


Men det virker fint hvis jeg gør sådan her:


<%

Set myPerson = new Person

myPerson.SetName = "Mr. John Doe"

session("mytest") = myPerson.GetName

Set myPerson = Nothing

response.write "myPerson is: " & session("mytest")

%>

hvor den så korrekt skriver:

myPerson is: Mr. John Doe




Måske skal jeg serilisere frem og tilbage, når jeg gemmer/aflæser session..?



Help! :)
Avatar billede softspot Forsker
23. februar 2009 - 15:42 #1
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


da egenskaben så bare kan benyttes således:

obj.Name = "Mr. John Doe"
aflaesProp = obj.Name


altså mere á la andre objekter...
Avatar billede softspot Forsker
23. februar 2009 - 16:02 #2
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>"
Avatar billede thesurfer Nybegynder
23. februar 2009 - 16:01 #3
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.
Avatar billede softspot Forsker
23. februar 2009 - 16:02 #4
Velbekomme :)
Avatar billede softspot Forsker
23. februar 2009 - 22:10 #5
Tak for point :)
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
Kurser inden for grundlæggende programmering

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