BF Summer sales
Pouze tento týden sleva až 80 % na HTML & CSS a JavaScript
80 % bodů zdarma na online výuku díky naší Letní akci!

Lekce 10 - Serializace a deserializace v C# .NET

V minulé lekci, LINQ to XML v C# .NET, jsme si představili technologii LINQ to XML.

V dnešním C# .NET tutoriálu si řekneme něco o serializaci a deserializaci.

Serializace je uchování stavu objektu. Trochu odborněji by se to dalo popsat jako konvertování objektu na proud bytů a poté uložení někde do paměti, databáze nebo souboru. Deserializace je opak serializace. Dalo by se říci, že tedy převedete zpátky proud bytů na kopii objektu.

K čemu je to dobré?

Serializace vám umožní uložit stav objektu a potom pomocí deserializace si ho kdykoliv znovu vytvořit. Pomocí serializace se třeba posílají data skrz síť nebo se ukládá nastavení aplikace.

Ukázková aplikace

Založíme si nový projekt typu Windows Forms Application. Poté si vytvoříme nějakou třídu, její instanci bychom chtěli zachovat a při opětovném spuštění aplikace ji mít ve stavu, v jakém jsme ji při zavření aplikace zanechali. Třídu nazveme Uzivatel a dáme jí vlastnosti Jmeno, Prijmeni a DatumNarozeni. Třída by teda mohla vypadat nějak takto (všimněte si, že je veřejná):

public class Uzivatel
{
    public string Jmeno { get; set; }
    public string Prijmeni { get; set; }
    public DateTime DatumNarozeni { get; set; }
}

Na hlavní formulář si přidáme tedy dva TextBoxy na jméno a příjmení. Ještě si přidáme ovládací prvek DateTimePicker, abychom mohli určit datum uživatele. Dále si někde umístíme tlačítko, kterým budeme přidávat uživatele do naší aplikace. Přidáme prvek ListBox pro zobrazení uživatelů. Nakonec si přejmenujeme naše ovládací prvky ze základního jména na nějaké, abychom se v nich vyznali. Viz. obrázek.

Pojmenování komponent ukázkové aplikace na serializaci ve Visual Studio

Dále si vytvoříme kolekci typu List<Uzivatel>, abychom měli uživatele kde v aplikaci uchovávat. Přesuneme se tedy do kódu hlavního formuláře (Form1 nebo u mě FormMain) a dopíšeme si do třídy tuto privátní kolekci.

private List<Uzivatel> uzivatele = new List<Uzivatel>();
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Přesuneme se zpátky do designeru formuláře a přidáme si metodu k události Click u ovládacího prvku btnPridej. Dopíšeme zde kód, který přidá uživatele do naší kolekce. Dále ještě musíme ukázat uživatele v listBoxUzivatele. K tomu nám poslouží vlastnost DataSource.

private void btnPridej_Click(object sender, EventArgs e)
{
    // Vytvoříme nového uživatele s daty z našich kontrolek
    Uzivatel uzivatel = new Uzivatel
    {
        Jmeno = tbJmeno.Text,
        Prijmeni = tbPrijmeni.Text,
        DatumNarozeni = dateTimePicker.Value
    };
    // Přidáme ho do naší kolekce
    uzivatele.Add(uzivatel);
    // Obnovíme zdroj dat našeho listBoxuUzivatele
    listBoxUzivatele.DataSource = null;
    listBoxUzivatele.DataSource = uzivatele;
}

Teď již máme vcelku funkční aplikaci. Když aplikaci spustíte a zkusíte uživatele přidat, uvidíte, že se přidala vlastně jen položka "NazevProjektu.Uzivatel". Přesuneme se tedy do souboru Uzivatel a přepíšeme metodu ToString(). Třeba nějak takto:

public override string ToString()
{
    return "Jméno: " + Jmeno +
        " Přijmení: " + Prijmeni +
        " Datum Narození: " + DatumNarozeni.ToShortDateString();
}

Zkuste si přidat uživatele teď a vidíme, že se uživatel zobrazuje lidštěji.

Serializace

Nyní konečně můžeme přejít k serializaci dat. Vytvoříme si tedy metodu Serializuj() v kódu formuláře.

private void Serializuj()
{
    try
    {
        // Vytvoříme si XmlSerializer na typ List<Uzivatel>
        XmlSerializer serializer = new XmlSerializer(uzivatele.GetType());

        // Alternativní forma, jak by to šlo také zapsat
        //XmlSerializer serializer = new XmlSerializer(typeof(List<Uzivatel>));

        // Vytvoříme Stream pomocí kterého budeme serializovat
        using (StreamWriter sw = new StreamWriter("uzivatele.xml"))
        {
            // Zavoláme metodu Serialize(), kde první parametr je Stream
            // Ten jsme vytvořili o řádek výše
            // Druhý parametr je objekt, který serializujeme
            serializer.Serialize(sw, uzivatele);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Využili jsme serializer do formátu XML. Serializerů je několik typů včetně binárního, poskytuje nám je již připravené .NET framework. Nemusíme se tedy starat o nic, instance se serializují automaticky. Nyní se vrátíme zpátky do designeru a u formuláře najdeme Event (událost) OnClosing, 2x klikneme a v obslužném kódu zavoláme naší metodu Serializuj().

private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
{
    Serializuj();
}

Pozn. Název metody se může lišit podle názvu hlavního formuláře. Jestli jste jeho jméno neupravovali, budete mít na začátku nejspíš prefix Form1.

Když nyní spustíme program, přidáme nějaké uživatele a program zavřeme, kolekce uživatelů se serializuje a uloží do NazevProjektu/Bin/Debug/uzivatele.xml. Když soubor otevřeme, měl by být čitelný. U mě soubor vypadá nějak takto:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfUzivatel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Uzivatel>
    <Jmeno>Jan</Jmeno>
    <Prijmeni>Novák</Prijmeni>
    <DatumNarozeni>2013-07-11T17:27:19</DatumNarozeni>
  </Uzivatel>
  <Uzivatel>
    <Jmeno>Jakub</Jmeno>
    <Prijmeni>Špatný</Prijmeni>
    <DatumNarozeni>2013-07-11T17:27:19</DatumNarozeni>
  </Uzivatel>
</ArrayOfUzivatel>

Deserializace

Serializaci máme, tak teď ještě deserializaci. Z pohledu na kód je to trošku těžší, proto raději všechno vysvětlím ještě jednou. Vytvoříme metodu Deserializuj() v kódu hlavního formuláře. Nejprve musíme zjistit, jestli vůbec daný XML soubor s daty existuje. K tomu nám poslouží třída File a metoda Exists(string path), která vrací bool. Do těla podmínky už vytvoříme XmlSerializer na typ našeho Listu uživatelů. Dále vytvoříme StreamReader s cestou k našemu souboru a pak jen zavoláme metodu Deserialize() z třídy XmlSerializer. Je tu ale drobný detail, a to že metoda Deserialize() vrací object. Musíme zde tedy přetypovat, než přiřadíme uložené uživatele k našim stávajícím. Celá metoda tedy vypadá ve finále takto:

private void Deserializuj()
{
    try
    {
        if (File.Exists("uzivatele.xml"))
        {
            XmlSerializer serializer = new XmlSerializer(uzivatele.GetType());
            using (StreamReader sr = new StreamReader("uzivatele.xml"))
            {
                uzivatele = (List<Uzivatel>)serializer.Deserialize(sr);
            }
        }
        else throw new FileNotFoundException("Soubor nebyl nalezen");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Tuto metodu zavoláme v události formuláře Load. Přejdeme tedy do designeru a ve vlastnostech (properties) formuláře najdeme událost Load a vytvoříme její obslužnou metodu. V ní zavoláme naší metodu Deserializuj() a k tomu ještě potřebujeme načíst naše uživatele do našeho ListBoxu. Celá metoda vypadá tedy takto:

private void FormMain_Load(object sender, EventArgs e)
{
    Deserializuj();
    listBoxUzivatele.DataSource = uzivatele;
}

Pozn. Název metody se může lišit podle názvu hlavního formuláře. Jestli jste jeho jméno neupravovali, budete mít na začátku nejspíše prefix Form1.

Když aplikaci spustíte a naplníte daty, zavřete a znovu otevřete, měla by obsahovat všechny uživatele, které jste tam přidali.

Závěr

Na závěr bych chtěl říct pár věcí, na které nejspíš přijdete i sami, když budete serializovat objekty vaší aplikace.

  • Třída, kterou serializujete, musí obsahovat bezparametrický konstruktor (nebo žádný parametrický). Je to z toho důvodu, že deserializer si nejdříve vytvoří prázdnou instanci a potom postupně zadává vlastnosti jak je čte ze souboru (nebo jiného streamu).
  • Nemůžete serializovat ovládací prvky, ať již defaultní a nebo vámi vytvořenou (User Control). Kdybyste ale chtěli, určitě nepotřebujete serializovat úplně všechno, takže si můžete uložit jen ty věci, které opravdu potřebujete.
  • K serializaci patří několik atributů, jako:
    • [XmlIgnore] - Nebude vám danou propertu serializovat.
    • [Serializable()] - Dává se nad deklaraci třídy, dáváte tomu jasně najevo, že se bude objekt serializovat.(Im­plementuje interface ISerializable)
    • [XmlAttribute("Name")] změní XML element z párového na nepárový a hodnota dané property bude v atributu Name. Například <Uzivatel Name="Jan"> místo <Jmeno>Jan</Jmeno>.
  • Kdyby jste někdy chtěli serializovat třídu Color, tak ona se sice serializuje, ale v souboru nemá žádnou hodnotu, proto můžete např. serializovat Color jako hexadecimální číslo a při deserializaci si ho jednoduše překonvertujete na barvu.

V následujícím cvičení, Řešené úlohy k 6.-10. lekci práce se soubory v C# .NET, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Stáhnout

Staženo 465x (58.1 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

Předchozí článek
LINQ to XML v C# .NET
Všechny články v sekci
Soubory a síť v C# .NET
Článek pro vás napsal Jan Vargovský
Avatar
Jak se ti líbí článek?
17 hlasů
H̴̢̡̛̫̙̖̦͍̥̺̳̪͖̺̫̲͇̗̹̠̥͈̭͔̻̗͚̭̥̝͐̋͒̆̾̅͒̈̐̀̒̔̇̈̔̆̎̔͐̊͆̆̐̊̈͆̂̐̓̓͛̌̈́̈́̅̅̔̚̕̚͠͝͝͝͝ì̸͇͖̹̯̤͇͍̹̥̅͗͆̄̌͆͑̓̈́̓̊̈́͋̈́͛͊͛͂̇͋͒̿̃͐͌̐̚͝͝͝͝͝͝.̶̧̡̧̧̖̫̯̞͖̯̩̠̭̩͇͔̤̱̜̠̠̙͉͉̼̱͓̣͍̱͎͕̦͓̫̗̮̦͍͚̗͕̥̳͚̬̯̞̟͇̻̺̙͙̜͖̰̊͒̌̌̚͜͜͝
Aktivity (5)

 

 

Komentáře

Avatar
Kit
Redaktor
Avatar
Kit:31.7.2013 13:25

Metoda File.Exists() je v uvedeném příkladu zbytečná. Obvykle je výhodnější přidat další catch.

Odpovědět
31.7.2013 13:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:31.7.2013 13:30

Ona je tam vlastně úplně zbytečná, jelikož se chytá Exception.

Odpovědět
31.7.2013 13:30
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:31.7.2013 13:46

Testování přístupu k souboru může být i v některých případech nebezpečné. Speciální nebo sdílené soubory se totiž mohou chovat jinak: Například se při pokusu o přístup mohou zamknout, mohou se automaticky smazat, změnit se jejich obsah, přečíst nějaké byty, která nám později budou chybět apod.

Další catch by samozřejmě byl potřebný jen pokud bychom potřebovali jemnější granularitu ošetření výjimky, což v uvedeném případě skutečně potřebné není.

Odpovědět
31.7.2013 13:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
paanoik
Člen
Avatar
paanoik:2.8.2013 14:29

Já ten přístup naopak chválím, protože cpaní try/catch pro ošetřování výjimečných stavů v příkladech vede k tomu, že je pak mladí používají tam, kde by měly být právě tyhle podmínky. Vede to pak hlavně k výraznému zpomalení aplikace, pokud jsou tyhle ošetření někde v cyklu. Jde nicméně o jednoduchý příklad, jak serializer používat, který jsem chtěl sám sepsat a linkovat (tedy díky autorovi za ušetření práce), protože spousta lidí se v tom motá.

Každopádně mě mrzí, že v článku chybí vysvětlení, proč jsou (musí být) vlastnosti public, jak serializovat statické vlastnosti, použití aliasů, a jak řešit problém s nutností serializace několika tříd do jednoho souboru. To jsou tak nejčastější problémy, se kterými se (navíc oproti tomu, co je v článku) stýkám v praxi a vysvětlování.

 
Odpovědět
2.8.2013 14:29
Avatar
Kit
Redaktor
Avatar
Odpovídá na paanoik
Kit:2.8.2013 14:49

Někdy stačí pochopit význam slova "výjimka". Je to něco, co se při řádném běhu programu zpravidla nestane.

K výjimce může dojít i když soubor bude existovat. Takže testovat jeho existenci je nejen zbytečné, ale dokonce škodlivé a často i nebezpečné.

Odpovědět
2.8.2013 14:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na paanoik
Jan Vargovský:2.8.2013 15:16

Jo vidíš, ten "problém" se serializaci do jednoho souboru jsem přemýšlel, ale pak jsem to tam už nedodělal(čti jako zapoměl, přišlo mi už tak toho hodně). Udělám ještě pokračování.

 
Odpovědět
2.8.2013 15:16
Avatar
paanoik
Člen
Avatar
Odpovídá na Kit
paanoik:2.8.2013 16:03

Jenže to je právě to, co si většina mladých kodérů neuvědomuje a nechápu, kde to nabrali .. naprosto běžně se setkávám například s ošetřování dělení nulou v nějakým krutě používaným cyklu, a pak dotazama, proč je to tak kurevsky pomalý.

Anžto u toho file to chápu, ale je to příklad, imo tam to ošetření nemuselo být vůbec.

 
Odpovědět
2.8.2013 16:03
Avatar
Kit
Redaktor
Avatar
Odpovídá na paanoik
Kit:2.8.2013 16:16

Ošetření výjimek běžně dělám o pár úrovní výš. Program se tím významně zkrátí. Samozřejmě je nutné určitou granularitu zachovat, ale testy mě k tomu samy navedou.

Odpovědět
2.8.2013 16:16
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
paanoik
Člen
Avatar
Odpovídá na Kit
paanoik:2.8.2013 16:48

global handler ftw ;) se slušným testováním ho pak lze jen slušně ohandlovat, udělat reportovací nástroj a používat napříč projektama :)

 
Odpovědět
2.8.2013 16:48
Avatar
Kit
Redaktor
Avatar
Odpovídá na paanoik
Kit:2.8.2013 17:09

S ftw zacházím opatrně, protože v adresářích mívám stovky tisíc souborů. Nechci si zabít výkon kvůli nesmyslům. Kromě toho na to raději používám specializované systémové nástroje, které jsou v takových případech obvykle rychlejší.

Slovo "global" mi nahání husí kůži. Podle mých zkušeností příliš velká globalizace vede do pekel. Užitečné návrhové vzory si ukládám přímo do svého editoru, abych je měl vždy k ruce.

Odpovědět
2.8.2013 17:09
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
paanoik
Člen
Avatar
Odpovídá na Kit
paanoik:2.8.2013 17:49

myšleno jako global error handler .. e.g.

try
{
  Application.Run(new Form1());
}
catch
{
  //global error handler here
}

Ale ono tohle zobecňování se dost dobře v praxi použít většinou nedá. Často dělám na nástrojích, které jsou jednoúčelové - konverze, import/export, zpracování dat, kde se dá buď říct, že to funguje, nebo se to posralo a jde o stav, který je buď potřeba nějak handlovat nebo na něj upozornit klienta. V obou případech pomáhá ten global handler, protože místo výjimky jednoduše vybleje obecnou hlášku, že při běhu programu došlo k chybě a do logu mi vypíše co potřebuju já (tzn. detailní exception). Já nebudu za blbce, protože program vlastně nespadl, jen se stalo něco, za co můžou stejně oni, protože testovací data problémy nezpůsobovala. A navíc mě to stojí minimum práce, narozdíl od hodnocení a handlování každé třídy zvlášť.

Jeden kolega mi kdysi řekl památnou větu ve smyslu, že pokud máš čas si hrát s takovýma blbostma jako lokální error handlery, vyhazuješ buď prachy svoje nebo klienta. Jako není to myšlený tak, že se všechny handlery nahradí jedním, tam, kde je zřejmý, že k těm problémům dochází (obecně cokoliv externího - soubory, db, knihovny), catchovat hned při psaní. Ale než paranoidně procházet celej kód a přemýšlet, kde by se to tak ještě mohlo posrat, global handler FTW.

 
Odpovědět
2.8.2013 17:49
Avatar
wolf661
Člen
Avatar
wolf661:5.7.2014 14:46

Cavte, ako som si tu vsimol vlastnosti triedy Uzivatel su verejne(public). Preco je to tak? Ja som si myslel ze jeden z principov OOP je zapuzdrenie.

Odpovědět
5.7.2014 14:46
Situácia normálna, všetko v hajzli.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na wolf661
David Čápka:5.7.2014 14:51

Kdyby vlastnost nebyla public, tak by ji deserializer těžko nastavil ;-)

Odpovědět
5.7.2014 14:51
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
wolf661
Člen
Avatar
Odpovídá na David Čápka
wolf661:9.7.2014 23:28

Aha tak preto diky.

Odpovědět
9.7.2014 23:28
Situácia normálna, všetko v hajzli.
Avatar
Michal Žůrek - misaz:2.1.2015 14:22

Ona XML serializace je skutečně jen na takové drobky, zvykl jsem si používat binární serializaci a už vůbec nemusím řešit nějaké bezparametrické konstruktory, neschopnost serializovat Dictionary a podobné věcičky. Jen teda ten výsledek není moc lidem čitelný, ale to většinou nevadí.

 
Odpovědět
2.1.2015 14:22
Avatar
forcabarca
Člen
Avatar
forcabarca:29.1.2016 22:36

Chyba v přiloženém kódu, kopíruji to (tohle by se vážně asi stávat nemělo přikládat kód s chybou):
Warning 1 Could not write lines to file "obj\Debug\\Tem­poraryGenerated­File_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs". The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters. SerializaceDe­serializace

 
Odpovědět
29.1.2016 22:36
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na forcabarca
Jan Vargovský:29.1.2016 22:42

Kód je ok, jen jsem tam nechal i věci z kompilace. Si smaž složku obj a zkompiluj.

 
Odpovědět
29.1.2016 22:42
Avatar
Štěpán Wünsch:17.5.2016 12:41

Proč není Serializer generický? Pokud serializuju jiný typ, než ten, který předám v konstruktoru, tak vyvolá vyjímku. Je to tím, že byl zaveden dřív než genericita? A dá se nějak obejít nutnost porušit zapouzdření? Díky za odpověď

 
Odpovědět
17.5.2016 12:41
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štěpán Wünsch
Jan Vargovský:17.5.2016 21:11

Můžeš to trošku rozvést? Instance serializeru je vázaná s typem, který budeš serializovat. Nemůžeš tam předat typ X a pak chtít po něm, aby serializoval typ Y.

 
Odpovědět
17.5.2016 21:11
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na Jan Vargovský
Štěpán Wünsch:18.5.2016 0:29

Hlavní otázka byla proč není Serializer generický, když se váže s typem. Přijde mi logičtější kdyby byl generický jako např. List<T>.

Při užití generické verze bych i ve Visual Studiu podle typu hned věděl, jaký typ serializuje. Připadá mi, že by generický byl lepší... Proto mě zajímá proč? Byly generické typy až v nějaké novější verzi? Nebo má třeba genericita v tomhle nějaká omezení?

 
Odpovědět
18.5.2016 0:29
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štěpán Wünsch
Jan Vargovský:18.5.2016 21:00

Protože to není potřeba. Klidně ho generický napsat můžeš. Ale snad víš co tam strkáš, tak nepotřebuješ IntelliSense...

 
Odpovědět
18.5.2016 21:00
Avatar
Garrom Orc Shaman:10.10.2016 10:17

Mohl bych se zeptat jak serializovaný soubor šifrovat, nenašel jsem na to žádný článek(možná jen hledám na špatném místě...i když kde jinde než v práci se soubory by mělo šifrování být ?)

-Garrom

Editováno 10.10.2016 10:17
Odpovědět
10.10.2016 10:17
Life for Code, Code for Life. I chose my path, I should stick on it.
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Odpovídá na Garrom Orc Shaman
Luboš Běhounek Satik:10.10.2016 10:47

Ten stream bys prohnal jeste pres jinej stream, pokud ti staci data udelat textove necitelny, tak muzes treba i vyuzit DeflateStream, kterej zaroven pouzije kompresi.

Pripadne si napsat vlastni stream, kterej to nejak zasifruje - budto obycejnym xorem nebo uz pak necim pokrocilejsim.

Odpovědět
10.10.2016 10:47
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Luboš Běhounek Satik
Garrom Orc Shaman:10.10.2016 14:57

takže místo klasického SreamWriter bych použil něco co text v .xml zašifruje. Existuje způsob jak vytvořit nějaký klíč pole kterého se to bude šifrovat ?
ps. Jako vážně, největší česká online učebnice C# a není tu nic o šifrované serializaci ?
-Garrom

Odpovědět
10.10.2016 14:57
Life for Code, Code for Life. I chose my path, I should stick on it.
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Odpovídá na Garrom Orc Shaman
Luboš Běhounek Satik:10.10.2016 15:12

muzes klidne podedit StreamWriter a jen tam pridat sifrovani nebo si na to muzes udelat vlastni stream, to uz je celkem fuk, kam tu sifrovaci funkcnost nacpes.
Klic si muzes vytvorit jakej chces, pokud bys data treba jen XORoval, to zalezi na sifrovacim algoritmu.

Odpovědět
10.10.2016 15:12
https://www.facebook.com/peasantsandcastles/
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Garrom Orc Shaman
Jan Vargovský:10.10.2016 15:48

Kryptografie je poněkud složitější oříšek než tohle. Kdybys raději řekl nějaký kontext okolo toho šifrování, pak bychom ti mohli doporučit něco, co bude zároveň bezpečné.

Btw,

Jako vážně, největší česká online učebnice C# a není tu nic o šifrované serializaci ?

Největší se nerovná nejlepší. Kvantita neznamená kvalitu ... Navíc serializace a šifrování jsou poněkud odlišné problémy a spojit je už je otázka dát ty volání sekvenčně za sebou.

Editováno 10.10.2016 15:51
 
Odpovědět
10.10.2016 15:48
Avatar
Odpovídá na Jan Vargovský
Garrom Orc Shaman:10.10.2016 16:56

chtěl jsem aby to nebylo lidsky čitelné a ani rozšifrovatelné nějakým procesem (spoustu textových editorů tuto možnost nabízí), aby to šlo rozšifrovat jen tímto heslem. Zároveň bych se nemusel bát že by na něj někdo přišel jelikož Unity3D si své soubory "konzervuje"(mezi tyto soubory patří i .cs skript uložený mezi assety)

Odpovědět
10.10.2016 16:56
Life for Code, Code for Life. I chose my path, I should stick on it.
Avatar
Petr Šťastný
Redaktor
Avatar
Petr Šťastný:10.10.2016 19:43
Objekt typu ... nelze serializovat. Vícerozměrná pole nejsou podporována.

Takže... co teď? :D

 
Odpovědět
10.10.2016 19:43
Avatar
Karel Labonek:30.8.2017 19:48

Mám problém při serializaci (pokusu o ni na třídě public ve které mám další instance mích tříd ) píše mi to : při reflexi typu došlo k chybě. Potřebuji uložit nastavení šachové hry a i odehrané hry jako takové. Děkuji za radu.

 
Odpovědět
30.8.2017 19:48
Avatar
Karel Labonek:30.8.2017 20:10

Omluva stačilo kouknout na komentář na demnou a je jasno vícerozměrná pole :-( .

 
Odpovědět
30.8.2017 20:10
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Karel Labonek
Jan Vargovský:30.8.2017 20:43

Binárně to už ale uložit jde :)

int[,] a = new[,]
{
    { 1,2 },
    { 3,4 }
};

BinaryFormatter formatter = new BinaryFormatter();
using (var ms = new MemoryStream())
{
    formatter.Serialize(ms, a);

    ms.Position = 0;

    var deserializedA = (int[,])formatter.Deserialize(ms);
}
Editováno 30.8.2017 20:44
 
Odpovědět
30.8.2017 20:43
Avatar
Odpovídá na Jan Vargovský
Karel Labonek:31.8.2017 6:37

Děkuji za tvou reakci, jen ještě jedna začátečnická otázka když mám to pole naplněno svým enumem (něco jako

public enum hodPolicka
    {
        prazdne, bila, bilaKral, cerna, cernaKral, B_C_Kamen, B_C_cernyKral, B_C_bilyKral
    }

)tak bude problém nebo ne? jsem momentálně v práci a nemohu to zkusit . Jen mám takové tušení že enum je stejně nějak vnitřně reprezentován samejma intama je to tak? Děkuji za případnou odpověď a omlouvám se za tyhle ne moc profesionální otázky.

 
Odpovědět
31.8.2017 6:37
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Karel Labonek
Jan Vargovský:31.8.2017 8:38

No interně se to zkompiluje na

public enum hodPolicka : int
    {
        prazdne = 0,
        bila = 1,
        bilaKral = 2
        ...
    }

Což je prostě int a bude to fungovat :)

Pro doplnění, enum můžeš reprezentovat všemi celočíselnými hodnotami, tj. sbyte, short, int, long a jejich unsigned varianty.

Editováno 31.8.2017 8:40
 
Odpovědět
31.8.2017 8:38
Avatar
 
Odpovědět
1.9.2017 15:51
Avatar
nickname01
Člen
Avatar
nickname01:19.11.2017 17:28

Myslím, že by bylo dobré kdyby tu bylo napsané jaké má serializace/de­serializace objektů výhody a nevýhody. Jaké to tedy má nevýhody a výhody?

 
Odpovědět
19.11.2017 17:28
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na nickname01
David Čápka:19.11.2017 17:31

To si snad dokážeš vyvodit z minulých dílu a z toho popisu tady :) Četl jsi to vůbec?

Odpovědět
19.11.2017 17:31
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
nickname01
Člen
Avatar
Odpovídá na David Čápka
nickname01:19.11.2017 17:40

Jo, četl jsem to. Pročtu si to ještě jednou :-)

 
Odpovědět
19.11.2017 17:40
Avatar
Jaroslav Janků:27. ledna 13:59

Mam problem pri opetovne serilizaci. Pri pridani polozky do kolekce a pokusu o serilizaci mi vyskoci chybova hlaska "pozadavek neni podporovan". Serialozvat muzu jen tak, kdyz pred serializaci smazu puvodni xml soubor. Muze mi nekdo poradit?

 
Odpovědět
27. ledna 13:59
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 38 zpráv z 38.