» »

[C#] Deserializacija

[C#] Deserializacija

Cvenemir ::

Lp.

Pri deserializaciji dobim med izvajanjem programa naslednji Exception:

Unable to cast object of type 'Seznam_Oseb.SeznamOseb' to type 'System.Collections.Generic.List`1[Seznam_Oseb.Oseba]'.

Izpisati želim osebe, ki so shranjene v .bin datoteki.

Koda:
public static void Deserializacija()
        {
            try
            {
                using (Stream stream = File.Open("seznam_oseb.bin", FileMode.Open))
                {
                    BinaryFormatter bin = new BinaryFormatter();
                    var osebeSSeznama = (List<Oseba>)bin.Deserialize(stream);
                    foreach (Oseba oseba in osebeSSeznama)
                    {
                        Console.WriteLine("{0} {1}, davčna številka: {2}", oseba.Ime, oseba.Priimek, oseba.Davcna);
                    }
                }
            }
            catch (IOException)
            {
                ;
            }
        }


Kje je napaka?

Spura ::

Sej ti tocno pise vrstico in tocno ti pise, da ne more castat Seznam_Oseb.SeznamOseb v List.

Cvenemir ::

Slučajno veš, kako naj popravim, da bo delovalo? :)

detroit ::

Kakšnega tipa pa je SeznamOseb
Skero

Cvenemir ::

SeznamOseb je razred, v katerem je deklariran seznam "osebe" tipa List.

detroit ::

misliš tipa
List<Oseba>
?
Skero

darkolord ::

Tkole mogoč:
var osebeSSeznama = (SeznamOseb)bin.Deserialize(stream);
                    foreach (Oseba oseba in osebeSSeznama.osebe)
                    {
                        Console.WriteLine("{0} {1}, davčna številka: {2}", oseba.Ime, oseba.Priimek, oseba.Davcna);
                    }

Cvenemir ::

@detroit: tako je.

@Darkolord: ne gre tako, napiše da OsebeSSeznama ne vsebuje definicije za "osebe"

detroit ::

pokažeš še serialization
Skero

mchaber ::

Pokazati nam moraš se Serialization. Tipa se morata ujemati.
.

darkolord ::

SeznamOseb je razred, v katerem je deklariran seznam "osebe" tipa List.

napiše da OsebeSSeznama ne vsebuje definicije za "osebe"
Kero zdej? :)

Cvenemir ::

Serializacija:
switch (izbira)
                {
                    case 1:
                        os = UstvariOsebo();
                        osebe.DodajOsebo(os);

                        //Shranjevanje seznama na datoteko
                        try
                        {
                            using (Stream stream = File.Open("seznam_oseb.bin", FileMode.Create))
                            {
                                BinaryFormatter bin = new BinaryFormatter();
                                bin.Serialize(stream, osebe);
                            }
                        }
                        catch (IOException)
                        {
                            ;
                        }                    
                        break;

Zgodovina sprememb…

  • spremenil: Cvenemir ()

Spura ::

Cvenemir je izjavil:

SeznamOseb je razred, v katerem je deklariran seznam "osebe" tipa List.

Aja? Zakaj ima ta tvoj list funkcijo DodajOsebo?

Cvenemir ::

Zato, ker naloga zahteva tako:
Izdelajte konzolno aplikacijo za delo s seznamom oseb.

Primeri uporabe:

dodajanje nove osebe v seznam,
izpis seznama,
brisanje seznama,
iskanje osebe z določeno davčno številko v seznamu.
NEOBVEZNO: shranjevanje seznama na datoteko in nalaganje seznama z datoteke

Spura ::

Spet nisi dojel namiga. Ti serializiras objekt tipa Seznam_Oseb.SeznamOseb, in ga potem deserializiras in ga castas v List<Oseba> ki je nekompatibilen tip. A ti moram narisat?

Mesar ::

Kaj noriš Špura? V konstruktor naj naredi... ne pa da ma probleme z nekompatibilnimi tipi, ne komplicirat tam kjer ni potrebe.
Your turn to burn!

Cvenemir ::

Mi lahko malo bolj podrobno razložiš, kakšen konstruktor imaš v mislih?

gnomee ::

Npr. da imaš razred SeznamOseb in lastnosti tipa string ime, string priimek, int starost preprosto naredi konstruktorja.

public SeznamOseb ()
{
ime = "";
priimek = "";
starost = 0;
} 

public SeznamOseb (string imeOsebe, string priimekOsebe, int starostOsebe)
{
this.ime = imeOsebe;
this.priimek = priimekOsebe;
this.starost = starostOsebe;
}


Potem pa dodajaš na seznam kot
seznamOseb.Add(new SeznamOseb(ime, priimek, starost));

Zgodovina sprememb…

  • spremenil: gnomee ()

Cvenemir ::

Za osebo in seznam oseb imam dva ločena razreda. V razredu Oseba, imam vgrajene zgoraj omenjene konstruktorje, medtem ko razred SeznamOseb, vsebuje le metode za manipulacijo seznama. Predlagaš, da razreda združim v enega?

Še kodi razredov:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Seznam_Oseb
{
    [Serializable()]
    class Oseba
    {
        //Atributi
        private string ime;
        private string priimek;
        private int davcna;

        //Konstruktor
        public Oseba(string ime, string priimek, int davcna)
        {
            this.ime = ime;
            this.priimek = priimek;
            this.davcna = davcna;
        }

        public Oseba()
        {
            this.ime = "";
            this.priimek = "";
            this.davcna = 0;
        }

        public string Ime
        {
            get { return this.ime; }
            set { this.ime = value; }
        }

        public string Priimek
        {
            get { return this.priimek; }
            set { this.priimek = value; }
        }

        public int Davcna
        {
            get { return this.davcna; }
            set { this.davcna = value; }
        }

    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Seznam_Oseb
{
    [Serializable()]
    class SeznamOseb : Oseba
    {
        List<Oseba> osebe = new List<Oseba>();
       
        //Metoda za dodajanje oseb na seznam
        public void DodajOsebo(Oseba o)
        {
            if (o.Ime != "" && o.Priimek != "" && o.Davcna != 0)
            {
                osebe.Add(o);
            }
            else
            {
                Console.WriteLine("Podatki niso popolni!");
            }           
        }

        //Metoda za izpis seznama
        public void IzpisSeznama()
        {
            foreach (Oseba o in osebe)
            {
                int i = 1;
                Console.WriteLine("{0} oseba: {1} {2}, z davčno številko {3}.", i, o.Ime, o.Priimek, o.Davcna);
                i++;
            }
        }

        //Brisanje celotnega seznama 
        public void BrisanjeSeznama()
        {
            osebe.Clear();
          
            if (osebe.Count == 0)
            {
                Console.WriteLine("Seznam je bil uspešno izbrisan.");
            }
            else
            {
                Console.WriteLine("Seznama ni mogoče izbrisati.");
            }
        }

        //Brisanje posamezne osebe z določeno davčno številko
        public void BrisanjeOsebe(int davcna)
        {
            Console.WriteLine("\nVnesite davčno številko osebe, ki jo želite izbrisati: ");
            davcna = int.Parse(Console.ReadLine());
            {
                foreach (Oseba o in osebe)
                {

                    if (o.Davcna == davcna)
                    {
                        osebe.Remove(o);
                        Console.WriteLine("Oseba je bila uspešno odstranjena.");
                        break;
                    }
                    else
                    {
                        Console.WriteLine("Osebe z določeno davčno številko ni na seznamu.");
                        break;
                    }
                }
            }
        }

        //Iskanje osebe z določeno davčno številko v seznamu
        public bool IskanjeOsebe(int davcna)
        {
            Console.WriteLine("Vnesite davčno številko osebe, ki jo želite najti: ");
            davcna = int.Parse(Console.ReadLine());

            foreach (Oseba o in osebe)
            {
                if (o.Davcna == davcna)
                {
                    Console.WriteLine("Oseba je bila najdena. Njeni podatki so: \n{0} {1}, davčna številka: {2}", o.Ime, o.Priimek, o.Davcna);
                }
                else
                {
                    Console.WriteLine("Osebe z določeno davčno številko žal ni na seznamu.");
                }
            }
            return true;
        }
    }
}

Zgodovina sprememb…

  • spremenil: Cvenemir ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

c# seminarska

Oddelek: Programiranje
112181 (1854) tuned
»

[c#] Ustvarjanje objekta v drugem razredu

Oddelek: Programiranje
81338 (1283) Cvenemir
»

c sharp LinkedList - Naloga

Oddelek: Programiranje
91437 (1388) Msatir
»

Povezani seznam

Oddelek: Programiranje
131708 (1305) pohano
»

[c#] Napačen izpis -- prazni stringi

Oddelek: Programiranje
51258 (1200) Spura

Več podobnih tem