C# típusos List objectum tartalmának szerializálása

C# típusos List objectum tartalmának szerializálása
2016-01-18T00:40:36+01:00
2016-01-20T22:01:30+01:00
2022-10-15T22:42:07+02:00
fireowl
<br><br>
Visual C#:
Egy konzolos tesztprojectet építettem a típusos List objectum fájlkezeléssének megértéséhez.

A program.cs -en kívúl két osztályt file-t generáltam, az egyik a fenti listát menedzseli (MyListControl_TickData.cs), a másik az lista adattagját valósítja meg (MyListTag_TickData).

Már fel tudom tölteni a listát elemekkel, le is tudom menteni MyListTag_TickData objectum segítségével.
Utána vissza tudom tölteni, de amikor a visszatöltött adatokat újra ki akarom listázni lefagy a progi. 



Segítségeteket előre is köszönöm!
Mutasd a teljes hozzászólást!
A deserializálás után már nem lesz ugyanaz a két lista.
Állítsd be a list03-at megint deserializálás után, és akkor jó lesz.

if (listControl01.Deserialize()) { list03 = listControl01.TickData_List; System.Console.WriteLine("Deserialize is ready"); }
Mutasd a teljes hozzászólást!

  • Kicsit próbáld meg ezt pontosabban megfogalmazni.

    Exception-t dob? Részletei? Vagy lemerevedik az UI?
    Mutasd a teljes hozzászólást!
  • A fordító hiba és figyelmeztetés nélkül lefordítja az aplikációt, az összes funkció működik:

    add > listát bűvíti 3 júj elemmel, és a végén kiírja a listában lévő elemek számát.
    clear > listát törli
    list> lista elemeit sorrendben kiírja a konzolra
    serialize> a lista elemeit egy fájlba elmenti
    deserialize> a fájlt tartalmát betölti az üres listába

    A lefagyás akkor keletkzik, mikor a lementett adatot visszatöltöm a listába és ki akarom iratni, tehát: 
    deserialize + list:
    a kép
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • A for ciklusban rossz listát vizsgálsz.

    i < listControl01.TickData_List.Count

    helyett inkább:

    i < list03.Count

    (vagy fordítva, tehát lehet, hogy a tickdata_list elemeit akartad kiírni, akkor viszont a for cikluson belül írtad el)
    Mutasd a teljes hozzászólást!
  • MyListControl_TickData listControl01 = new MyListControl_TickData();
    List<MyListTag_TickData> list03 = listControl01.TickData_List;

    A  képből nem látszik de a két lista ugyanaz. Egyébként kijavítottam, hisz a jó kód az átlátható is :)

    A probléma továbbra is ugyanaz. Feljebb csatoltam az konzol applikáció-t tömörítve, a legális vírusirtóm szerint tiszta. Szóval ha van feltelepítve VS akkor ti is kipróbálhatjátok működés közben.

    Segítséget előre is köszönöm!
    Mutasd a teljes hozzászólást!
  • A képből nem látszik de a két lista ugyanaz. Egyébként kijavítottam, hisz a jó kód az átlátható is :)

    Én ennek nekimennék még egyszer, debugold körbe, mi:
    - public List<MyListTag_TickData> TickData_List; a címe és tartalma,
    - List<MyListTag_TickData> list03 = listControl01.TickData_List; a címe és tartalma
    serialization előtt után, meg desiralization előtt és után.

    Ott kell lennie a válasznak.

    Tippem szerint a 

    TickData_List = (List<MyListTag_TickData>)formatter.Deserialize(stream);
    úgy működik, hogy a serializált osztály memória képét állítja vissza egy új memória területre.

    És ahogy hurka is írta, olyat nem csinálunk, hogy A lista darabszáma alapján végigmegyünk B listán, mégha néha A és B ugyanaz is.
    Mutasd a teljes hozzászólást!
  • A deserializálás után már nem lesz ugyanaz a két lista.
    Állítsd be a list03-at megint deserializálás után, és akkor jó lesz.

    if (listControl01.Deserialize()) { list03 = listControl01.TickData_List; System.Console.WriteLine("Deserialize is ready"); }
    Mutasd a teljes hozzászólást!
  • Hurka, ördögöd van!

    Tényleg ez volt a megoldás, nálad az 50 pont!

    Utólag is köszönöm!
    Mutasd a teljes hozzászólást!
  • Ez csak tüneti kezelés :) A baj már a list03 létezése is :) Illetve hogy a deserilize() egy másik címre állítja vissza az osztály memória képét (pl.: nem az osztályt, ezért a constructora sem fut le), de ezt nem vetted/veszed figyelembe.
    De ezt debug során észre kellene venned, hogy más lesz a cím. Meg kéne szokni/tanulni ezt is :)
    Mutasd a teljes hozzászólást!
  • Elméletileg az objektum-orientáltságnak és a szerilizálásnak az lenne a lényege hogy a programozó dolgát megkönnyítse, de én azt tapasztalom, hogy a legegyszerűbb feladatok megoldására is keserves út vezet.

    Miért kéne nekem az objektum példányok címeit figyelni a fizikai memóriába, mikor az objektum változók is oda kellene hogy mutassanak?
    Mutasd a teljes hozzászólást!
  • Hát a programozás olyan mint a lego: ismerned kell a kis kockákat amiket használsz, hogy jól használd, és a kész cucc úgy működjön, ahogy szeretnéd.

    Jó a serializáció is, de nem csodafegyver. Jó az objektum orientáltság is, de az se csodafegyver. Csak eszközök, amik minden esetben (mint az életben is egy egyszerű eszköz mint a csavarhúzó eléggé korlátos) csak bizonyos esetben és csak arra jók.

    Ezért kell egy kicsit jobban megismerned és értened, hogy a list03 miért volt hibás deserializáció után, és hogy a referenciák sem csodafegyverek (referenciák, mutatók ilyenek).

    Ilyen ez :)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd