[c#][sharepoint] Hoe persist ik een ArrayList-type member?

Pagina: 1
Acties:
  • 137 views sinds 30-01-2008
  • Reageer

  • SayDay
  • Registratie: Juni 2004
  • Laatst online: 08-05-2021
Ik ben bezig met een user control die je met behulp van een SmartPart kan laden in Sharepoint Services. Voor zij die nog niet weten waar ik het over heb:
de site van Sharepoint Services http://www.microsoft.com/...s/sharepoint/default.mspx
de site van SmartPart (http://www.gotdotnet.com/...4d-41c3-8a88-3f974a7d0abe)
de site van Jan Tielens 'de' vader van Smart Part: http://weblogs.asp.net/jan/


Ik heb nog niet genoeg ervaring om in te schatten of mijn probleem Sharepoint/Smart Part specifiek is, of dat ik gewoon een .Net denk fout maak. Komt ie dan.

Ik heb een werkende user control waarmee ik een thumbnail kan maken van een Office document opgeslagen in Sharepoint. Deze thumbnail kan ik ook weergeven in de browser. De thumbnail en meta-data zitten in een class genaamd SharepointThumbnail. Ik wil de user de mogelijkheid bieden om een verzameling van thumbnails bij te houden in een class ThumbnailCollection. Als implementatie van die collectie heb ik gekozen voor een ArrayList.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public class SharepointThumbnail : ThumbnailBase
    {
        #region Members
                  ......
        #region Properties
                  ......
        #region Constructor
                  ......
    }

    public class ThumbnailCollection : System.Web.UI.UserControl, SmartPart.IUserControl
    {
        private ArrayList thumbNailList = null;

        public ThumbnailCollection()
        {
            thumbNailList = new ArrayList();
        }

    }


Het probleem:

Na wat leeswerk ben ik er achter gekomen dat de class opnieuw geinstantieerd wordt iedere keer als de pagina een reload/submit/postback ondergaat. Ik heb geprobeerd de ArrayList te laten overleven door heb te bewaren in ViewState, Session en Cache. Maar ik krijg van Sharepoint een error ("An unexpected error has occurred."), zodra ik in ViewState, Session of Cache een object van een class bewaar. Dit gaat dus steeds fout:

C#:
1
2
3
4
5
6
7
8
// het onderstaande levert een error op: 
myArrayList = new ArrayList(); 
ViewState["myList"] = myArrayList; 
// dit ook: 
Size mySize = new Size(); 
ViewState["myList"] = mySize; 
// het lijkt steeds een error op te leveren als ik probeer:
ViewState["myList"] = <anyObjectFromAClass>; 


Met literal typen (of value-typen?) gaat het wel goed. De EnableViewState property staat op 'true'.

Ligt dit aan:
A: aan mij? :)
B: aan een beperking in .NET?
C: aan een beperking in SmartPart/Sharepoint?

Mijn vraag:
Hoe krijg ik een de ArrayList en de objecten daarin "gepersist" (dit woord bestaat niet, I know ;) ), zodat ze een PostBack overleven? Nota bene: iedere instance van ThumbnailCollection moet zijn eigen ArrayList bevatten.

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
Om in de viewstate bewaard te blijven moeten object geserializeerd worden. Dit betekent dat er een string-representatie van de instantie gemaakt wordt. De string wordt dan in de viewstate bewaard.

Als je op google zoekt naar "serialize arraylist", dan krijg je wel een aantal bruikbare resultaten. Bijv deze.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je object moet idd serializable zijn.

Dit kan door de [Serializable] attribute aan je class toe te voegen of door ISerializable te implementeren. Bij de laatste kan je het serializeren zelf implementeren.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • SayDay
  • Registratie: Juni 2004
  • Laatst online: 08-05-2021
Kijk, dat wist ik niet! Bedankt. Eens opzoeken of dit dan ook geldt voor Cache, Application en Session...

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het ligt eraan waar die opgeslagen worden.

Zolang de Collection In-Memory opgeslagen wordt hoeft dat niet. Als hij op HD/in een Database/In je webpage wordt opgeslagen dan moet hij worden Geserializeerd. Session draait standaard gewoon in-process dus dan hoef je je objecten niet te kunnen serializeren. Maar als je de Session configureert dat hij gebruik maakt van een Database dan moeten je objecten wel geserializeerd worden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Glorix Jim
  • Registratie: Februari 2000
  • Laatst online: 22-02 14:03
Als je t nou zonder die Smartpart deed dan kon je het opslaan in de webpart properties ;)
Pagina: 1