Zoltán's profileÁrvai Zoltán BlogjaBlogLists Tools Help

Blog


    July 03

    A Dictionary nemlétező sorosíthatósága

    Érdekes probléma vetődött fel a prog.hu társalgójában. Dictionary-t kellene xml sorosítani. Valljuk be az igény jogos. Szokásunkhoz híven püföljük is a billentyűzetet bőszen, aztán mikor futtatjuk azt kapjuk, hogy IDictonary-t nem lehet sorosítani. Lázasan turkálva az MSDN-t arcunkba csap a hideg levegő: "Nem volt idő implementálni". Két féle ember van. Az egyik itt leül és szidalmaz mindent és mindenkit akit ér. A másik, aki ezen a problémán könnyen átlibben (mert még emlékszik arra, hogy lehet programozni is a kattingatáson túl) és neki ár írni egy wrappert, vagy saját gyűjteményt. Nos én ez utóbbi csoportba tartozom.

    Először is tudni kell, hogy egy generikus Dictionary-ben KeyValuePair-ek vannak. Na most mivel az XML sorosító egy rakás követelményt támaszt az osztállyal szemben, aminek a KeyValuePair (úgy fest) nem tud megfelelni, ezért kell egy saját ilyen Entry osztály. Előkapjuk generikus típus ismereteinket és vmi hasonlót pötyöghetünk le.

    image

    Ugye miről van szó, két változóm van, egy Kulcs (T típusú) és egy Érték (U típusú). Kell bele egy default konstruktor, a mezők publikusak kell, hogy legyenek, akár csak az osztály, és két attribútumot is elhelyzeztem a változók elé, jelezvén, hogy az xml kimenetben attribútumként jelenjenek meg. A KeyValuePair-t kiváltottuk.

    Következő körben kéne maga az a saját gyüjtemény, vagy valami hasonló, ami eltárolja nekem ezeket az entry-ket. Most egy sima generikus belső listát hoztam e célból létre.

    image

    Úgy elsőre valami ilyesmit skiccelnék fel. Nyilván van ennél szebb megoldás is, de nekem ez most kellően egyszerű :)

    A kényelmesség kedvéért csináltam egy Add függvényt is, indexer most lemaradt. Minden add hívás, egy ilyen Entry példányt hoz létre és elhelyezi a belső listába, amihez egyébként az Items propertyn keresztül hozzá lehet férni. Egy-két attribútumot is elhelyeztem annak érdekében, hogy az XML kimenet egyszerű és rövid és áttekinthető legyen. Innetől kezdve egészen nyugodtan használhatjuk az új Dictionary-nket. Pl így:

    image

    Ebben a példában egy olyan MyDictonary példányt hozok létre, ahol a kulcs és az érték is string, utánna simán xml sorosítom. Nyilván lehet saját gyűjteményeket is írni, Interface-ekből építkezni, vagy teljesítményre helyezni a hangsúlyt, ha valami komolyabbat szeretnénk.

    Az Xml formázásnak köszönhető a végeredmény a következő:

    image