Avatar billede decrypto Nybegynder
14. september 2006 - 15:04 Der er 30 kommentarer og
1 løsning

Hvordan gemmer jeg et objekt i en cookie?

Hejsa

Jeg har en et objekt som fx. er et adresse objekt med vejnavn, husnr, post.nr etc. Dette objekt vil jeg gerne gemme i en cookie. Cookie delen har jeg styr på, men jeg har fået at vide at jeg har behov for at serialisere mit objekt inden jeg smider det ned i en cookie... Jeg har ledt på nettet, men har ikke kunne finde et brugbart eksempel.

Er der nogen herinde der kunne hjælpe med et eksempel på hvordan jeg kan serialisere mit objekt.
Avatar billede mikkel_sommer Nybegynder
14. september 2006 - 15:45 #1
Kan du ikke bare tilføje:

[Serializable]

over klassenavnet?
Avatar billede tuxic Nybegynder
14. september 2006 - 21:22 #2
Er hele ideen med cookies ikke at de udpeger et objekt på serveren? Selve objektet skal vel ikke ned i cookien? (Giver vel anseelige sikkerhedsissues)
Avatar billede Syska Mester
14. september 2006 - 23:30 #3
Hvordan skulle en IIS huske på hvad brugeren så sidst?

Man bliver jo nød til at gemme det hele .... eller skal man selv lave noget hvor der så bare ligger en ref til en SQL table eller noget ...

// ouT
Avatar billede arne_v Ekspert
15. september 2006 - 02:47 #4
binære serialisering + base 64 encoding
xml serialisering
custom serialisering (items separeret af komma eller semikolon eller ...)
id som er index i databasen

der er frit valg
Avatar billede decrypto Nybegynder
15. september 2006 - 08:27 #5
Det skal være binær serialisering el. måske custom. Er der et eksempel man kan blive inspireret af?
Avatar billede decrypto Nybegynder
15. september 2006 - 08:45 #6
hmmmm jeg har fundet et lille simpelt eksempel, men det giver mig ikke lige det jeg har brug for.

I mit tilfælde har jeg en etitetsklasse, der indkapsler noget data. Denne entitets klasse vil jeg gerne gemme i en cookie. Dvs. at jeg gerne vil kunne serialisere denne entitets klasse.

Nu er det jo sådan at entitets klasser jo ikke må have andre funktioner. De skal jo bare holde på data.

Skal jeg lave en ny klasse, hvori min serialiserings metoder ligger? Kunne egentligt godt tænke mig at se et eksempel, hvor en entitetsklasse bliver serialiseret og gemt i en cookie, og naturligvis en deserialiserings eksempel af det. :-)
Avatar billede decrypto Nybegynder
15. september 2006 - 10:03 #7
hmmm fordi en cookie.value er af type string, skal jeg konvertere mit serialiserede objekt fra byte stream til en string. Kan ikke finde noget eksempel på dette på nettet :-(
Avatar billede arne_v Ekspert
15. september 2006 - 13:26 #8
mit forslag var base 64
Avatar billede arne_v Ekspert
15. september 2006 - 13:27 #9
Convert.ToBase64String
Convert.FromBase64String
Avatar billede decrypto Nybegynder
15. september 2006 - 13:30 #10
Har du et eksempel på et objekt du serialiserer og konverterer til en string?
Avatar billede arne_v Ekspert
15. september 2006 - 13:32 #11
public static byte[] Object2ByteArray(Object o)
    {
        MemoryStream ms = new MemoryStream();
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(ms, o);
        return ms.ToArray();
    }
    public static object ByteArray2Object(byte[] theByteArray)
    {
        MemoryStream ms = new MemoryStream(theByteArray);
        BinaryFormatter bf = new BinaryFormatter();
        ms.Position = 0;
        return bf.Deserialize(ms);
    }


konverterer mellem object og byte[]

base64 konverterer mellem byte[] og string
Avatar billede arne_v Ekspert
15. september 2006 - 13:33 #12
det eneste jeg er idt bekymret for er længden !!
Avatar billede decrypto Nybegynder
15. september 2006 - 14:21 #13
Det objekt jeg skal gemme er et meget lille objekt, det gemmer kun en adresse og et postnr. Mit objekt er derfor af typen ShortAddress, som er min entitetsklasse.


Jeg prøver liiiiiiige.....
Avatar billede decrypto Nybegynder
15. september 2006 - 14:22 #14
Hvad med din serialiserings klasse? Hvordan ser den ud?
Avatar billede arne_v Ekspert
15. september 2006 - 15:07 #15
ovenstaaende kode serialiserer og deserialiserer
Avatar billede decrypto Nybegynder
15. september 2006 - 15:12 #16
Ok....det burde vel ikke være et problem at serialisere et array af objekter, vel?
Avatar billede arne_v Ekspert
15. september 2006 - 15:22 #17
nej
Avatar billede decrypto Nybegynder
15. september 2006 - 15:54 #18
Yes. Så fik jeg serialiseret et objekt. Spørgsmålet er hvordan jeg konverterer min string fra cookie til en byte[], hvordan gør jeg det?
Avatar billede decrypto Nybegynder
15. september 2006 - 16:00 #19
Lige nu gør jeg følgende:

// Deserialize
object address = ByteArrayToObject(cookieValue); //<--- cookieValue er strengen fra min cookie
ShortAddress newAdress = new ShortAddress();       
newAdress = (ShortAddress) address;
Avatar billede arne_v Ekspert
15. september 2006 - 17:12 #20
mit forslag er et bruge base 64 encoding

altsaa

string s = Convert.ToBase64String(ObjectToByteArray(o));

og

X o = (X)ByteArrayToObject(Convert.FromBase64String(s));
Avatar billede decrypto Nybegynder
18. september 2006 - 08:31 #21
Jeg prøver følgende og får en InvalidCastException:
---------------------------------
// Get Cookie
string cookieValue = GetCookie("MinCookie");
       
// Deserialize
string serializedAddressObject = Convert.ToBase64String(ObjectToByteArray(cookieValue));
ShortAddress newAddress = (ShortAddress)ByteArrayToObject(Convert.FromBase64String(serializedAddressObject));
--------------------------

Hvad gør jeg galt? :-)
Avatar billede decrypto Nybegynder
18. september 2006 - 08:33 #22
Det er når jeg prøver at caste den til ShortAddress at den brokker sig ->
(ShortAddress)ByteArrayToObject(Convert.FromBase64String(serializedAddressObject));
Avatar billede decrypto Nybegynder
18. september 2006 - 09:17 #23
Fejlen siger:
Unable to cast object of type 'System.String' to type 'ShortAddress'.

Hvordan kan jeg få castet den til mit objekt igen?
Avatar billede decrypto Nybegynder
18. september 2006 - 11:17 #24
Hovsa....fandt lige noget der ikke stemmer:

Har ændret koden til....
-------------------------------
// Deserialize
string serializedAddressObject = cookieValue;
ShortAddress newAddress = (ShortAddress)ByteArrayToObject(Convert.FromBase64String(serializedAddressObject));
-------------------------------

Tjekker om det virker.
Avatar billede decrypto Nybegynder
18. september 2006 - 11:19 #25
Det virkede....:-)

Nu skal jeg bare prøve det med Arrays af objekter.....giver point....når det er er en succes...holder lige denne åbent, hvis der skulle dukke noget op. :-)
Avatar billede decrypto Nybegynder
18. september 2006 - 13:02 #26
Men nu har jeg problemer med at at serialisere mine generiske kollektioner af mit objekt.
Avatar billede decrypto Nybegynder
18. september 2006 - 13:08 #27
Serialiseringen går godt. Det er casting der bøvler.

Jeg forsøger flg.
return (List<ShortAddress>)ByteArrayToObject(Convert.FromBase64String(serializedAddressObject));

Og her er det min casting (List<ShortAddress>), der giver problemer. Det burde vel være muligt at kunne caste.
Avatar billede decrypto Nybegynder
18. september 2006 - 14:58 #28
Man skal åbenbart caste implicit.

Denne linje hjalp
return ByteArrayToObject(Convert.FromBase64String(serializedAddressObject)) as List<ShortAddress>;

Måske kan du forklare det :-)

Hvorfor skal man caste implicit?

Du får points når du smider et svar ind.
Avatar billede arne_v Ekspert
19. september 2006 - 04:54 #29
mystisk

følgende virker hos mig:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections.Generic;

namespace E
{
    public class MainClass
    {
        public static byte[] Object2ByteArray(object o)
        {
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, o);
            return ms.ToArray();
        }
        public static string Object2String(object o)
        {
            return Convert.ToBase64String(Object2ByteArray(o));
        }
        public static object ByteArray2Object(byte[] b)
        {
            MemoryStream ms = new MemoryStream(b);
            BinaryFormatter bf = new BinaryFormatter();
            ms.Position = 0;
            return bf.Deserialize(ms);
        }
        public static object String2Object(string s)
        {
            return ByteArray2Object(Convert.FromBase64String(s));
        }
        public static void Main(string[] args)
        {
            DateTime dt1 = DateTime.Now;
            Console.WriteLine(dt1);
            DateTime dt2 = (DateTime)String2Object(Object2String(dt1));
            Console.WriteLine(dt2);
            List<string> lst1 = new List<string>();
            lst1.Add("A");
            lst1.Add("BB");
            lst1.Add("CCC");
            foreach(string s in lst1) Console.WriteLine(s);
            List<string> lst2 = (List<string>)String2Object(Object2String(lst1));
            foreach(string s in lst2) Console.WriteLine(s);
            Console.ReadLine();
        }
    }
}
Avatar billede arne_v Ekspert
19. september 2006 - 04:54 #30
og svar
Avatar billede arne_v Ekspert
19. september 2006 - 04:59 #31
omend den her nok er mere 2'sk:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections.Generic;

namespace E
{
    public class Ser<T>
    {
        public static byte[] Object2ByteArray(T o)
        {
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, o);
            return ms.ToArray();
        }
        public static string Object2String(T o)
        {
            return Convert.ToBase64String(Object2ByteArray(o));
        }
        public static T ByteArray2Object(byte[] b)
        {
            MemoryStream ms = new MemoryStream(b);
            BinaryFormatter bf = new BinaryFormatter();
            ms.Position = 0;
            return (T)bf.Deserialize(ms);
        }
        public static T String2Object(string s)
        {
            return ByteArray2Object(Convert.FromBase64String(s));
        }
    }
    public class MainClass
    {
        public static void Main(string[] args)
        {
            DateTime dt1 = DateTime.Now;
            Console.WriteLine(dt1);
            DateTime dt2 = Ser<DateTime>.String2Object(Ser<DateTime>.Object2String(dt1));
            Console.WriteLine(dt2);
            List<string> lst1 = new List<string>();
            lst1.Add("A");
            lst1.Add("BB");
            lst1.Add("CCC");
            foreach(string s in lst1) Console.WriteLine(s);
            List<string> lst2 = Ser<List<string>>.String2Object(Ser<List<string>>.Object2String(lst1));
            foreach(string s in lst2) Console.WriteLine(s);
            Console.ReadLine();
        }
    }
}
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