Deserializace určité třídy – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Deserializace určité třídy – .NET – Fórum – Programujte.comDeserializace určité třídy – .NET – Fórum – Programujte.com

 

Mutagen
~ Anonymní uživatel
489 příspěvků
4. 12. 2019   #1
-
0
-

Zdravím,

je nějak možné při deserializaci získat pouze určitou třídu, když mám hlavní třídu (kterou serializuju) a v ní jsou další třídy jako podsekce? př
 

[Serializable]
    public class Ser
    {
        public float A;
        public float B;
        public float C;
    }

    [Serializable]
    public class Ser2
    {
        public float D;
        public float E;
        public float F;
    }

    [Serializable]
    public class ClassTest
    {
        public Ser SerA;
        public Ser2 SerB;
    }

Serializace třídy "ClassTest" ale deserializace jenom Ser2, je to vůbec nějak reálné? Nebo musím opravdu vše?
Jde mi hlavně o to, že když tam budu mít hodně dat abych zbytečně nečetl data, ale třeba jen hlavičku.

Nahlásit jako SPAM
IP: 193.138.154.–
MilanL+1
Expert
4. 12. 2019   #2
-
0
-

#1 Mutagen
tu interní .NET deserializaci neovlivníš, je to zabalené v sobě takže musíš načíst nadřazenou třídu, aby ses dostal k té vnořené.

Jiná situace by byla pokud bys měl nad serializací a deserializací plnou kontrolu tzn. vlastní serializační a deserializační metody, pak by podle některý nastavených vlastností mělo jít pomocí offsetů přistupovat jen k vybraným vnitřním částem. Hodně při tom záleží na struktuře uložení Pevná/Proměnná velikost případně na formě uložení textová/paměťová forma apod.

Nahlásit jako SPAM
IP: 91.139.9.–
Mutagen
~ Anonymní uživatel
489 příspěvků
4. 12. 2019   #3
-
0
-

#2 MilanL
Tak to bych zrovna mohl si vytvořit vlastní fileformat, když bych měl mít vlastní de/serializační metody.

Takže reálný to bohužel není, dobře. Toto mi asi stačí, zkusím to vyřešit nějak jinak např spec. soubor čistě pro header a data.

Díky za info.

Nahlásit jako SPAM
IP: 193.138.154.–
Kit+14
Guru
4. 12. 2019   #4
-
0
-

#3 Mutagen
Opravdu chceš serializovat třídu a ne její instanci?

Nahlásit jako SPAM
IP: 46.135.87.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
MilanL+1
Expert
4. 12. 2019   #5
-
0
-

#3 Mutagen
o co má jít, nějaká databáze/více různých tabulek v jednom souboru?

Nahlásit jako SPAM
IP: 185.112.167.–
Mutagen
~ Anonymní uživatel
489 příspěvků
4. 12. 2019   #6
-
0
-

#5 MilanL
Jedná se o ukládání progresu hry (Unity3D), tzv pozice objektů, stavy, jejich parametry, a tak dále. A hlavičku chci mít jako info do menu při zobrazování savů (gametime, datetime, úroveň a tak dále) prostě jen informace o progresu a dále mít v tom ten zbytek a že toho nebude málo.

Nahlásit jako SPAM
IP: 89.190.91.–
MilanL+1
Expert
4. 12. 2019   #7
-
0
-

#6 Mutagen

no ta hlavička by nemusela být problém, dáš jí na 1. místo a jako první jí načteš, problém může být s objekty hry, jestli sis myslel, že ti to samo uloží a znovu načte obsah tak jak byl, tak to načtení tak jednoduché nebude.

Je třeba obnovit objektovou strukturu v paměti, tzn pro každej objekt vytvořit instanci a to deserializer myslím neudělá bo neví předem kolik jakých objektů bude, navíc serializable třídy se nedají dědit. Proč myslíš, že loady trvají tak dlouho?

Nahlásit jako SPAM
IP: 185.112.167.–
Mutagen
~ Anonymní uživatel
489 příspěvků
5. 12. 2019   #8
-
0
-

#7 MilanL
Však já neřikám, že to udělá za mě, já si pro to vytvořil vlastní třídy do který naplnuju data a ty chci právě uložit. Chtěl jsme to řešit že to napíšu vlastní format, ale když jsme se dočetl o serializaci tak se mi ve výsledku ulevilo, protože to udělá vše za mě jen si to vyčtu zpět do tříd a ty pak budu samosebou procházet a nastavovat všechny promenný. Jen sem prostě hledal nejlepší způsob jak uložit data... Vyřešil jsem to jinak, vytvořil jsem si spec. soubor že kterýho budu načítat informace do load menu a podle výběru si přiřadím file a ten načtu.

Nahlásit jako SPAM
IP: 89.190.91.–
MilanL+1
Expert
5. 12. 2019   #9
-
0
-

#8 Mutagen
no tos nepochopil asi úplně přesně, může to být jednodušší, než si myslíš, tedy záleží na organizaci objektů hry.

Jsou 2 varianty:

- pokud jsou všechny objekty hry výchozí součástí scény, stačí ti ukládat jen několik parametrů jako pozice, rotace případně stav jako je např poškození velikost apod, to pak načíst deserializátorem a aplikovat na daný objekt - nevýhodou je, že bys musel mít pevně danou identifikaci objektů, bud přes ID nebo neměnným indexováním (pořadím) v poli/listu.

- druhou variantou vhodnou např pro náhodně generované objekty je uložení celého objektu, ale pak musíš mít při deserializaci informace o typech objektů, tzn načíst nejdřív typ /případně počet/ -> vytvořit herní objekt/y/ daného typu a pak načíst deserializací.

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Expert
5. 12. 2019   #10
-
0
-

v prvním případě ukládáš u objektů jen identifikaci a údaje, které se v průběhu hry mění,

v druhém případě ukládáš data objektu dle nějakého schématu - zde je třeba správně rozvrhnout datový model, aby toho nebylo moc, např u modelů, textur a materiálů nepoužívat názvy nebo nedej bože plné cesty k souborům, ale ID v seznamu, to se pak doplní do neserializovaných dat objektů v po nahrávací proceduře.

Nahlásit jako SPAM
IP: 91.139.9.–
Mutagen
~ Anonymní uživatel
489 příspěvků
5. 12. 2019   #11
-
0
-

#10 MilanL
Ano já tohle všechno vím, nedělám v tom pár týdnů, ale už pár měsíců. Vím jak to musím udělat aby to fungovalo, já sem se jen ptal o serializaci/deserializaci určité třídy, kde je více tříd uložených (tzv 1 subclass z mainclass) nikoli na to jak pracovat ve hře s objekty a jejich ukládání. Já vím, že musím ty objekty mít předem definované a podle nějakýho ID nastavovat, popř pokud je to nový objekt tak vytvořit, tohle všechno orpavdu vím. Mě fakt šlo jen o uložení parametru (dat) tak abych nemusel pak načítat celý "save" kterej ve výsledku může mít několik mb. Vím, že na dnešní rychlosti disků a cpu je docela irelevantní, ale když by mě to mělo načítat 20 savů po třeba 50mb tak je to hned něco okolo 1gb paměti a takovýhle "zpomalení" a ještě k tomu v menu, který je jen jednoduchá scéna je totální blbost. Vyřešil jsem to jedním main souborem ve složce se savy, kde se ukládá jen header info a jaký filesave k tomu záznamu je přiřazen a pak bude loading "pravýho" savu, kde bude vše potřebné k nastavení scény a objektů.

Jediné k čemu jsem se ještě nedostal je UID objektů předem vytvořených ve scéně, jestli je pokaždém spuštění instance (hry) se přiřadí nové UID a nebo jestli se zachovávají napříč celé scény která už existuje, ale k tomu se postupně budu dostávat až budu ukládat data o objektech ve scéně.

Takže znovu opakuju, že mám předem určenou strukturu (třídu) kde mám v podsturuktur (podtřídy) a každá má svoje využití např class PlayerData, class Enemies, class SceneItems a tak dále a každá class má svoje proměnné (id, pozice, rotace, parametry scriptů, a tak dále) prostě vše co je potřeba k tomu aby se zpětně mohlo nastavit stav objektu. A jelikož jsem jen hledal jak to nejlípe uložit tak sem přišel na de/serializaci ale tam mě reálně nešlo načíst např jenom header ze souboru, což mi bylo řečeno, že ne, tak jsme to vyřešil hlavním save souborem jen o header informacích.

PS. Proč bych si měl držet v souboru cesty k texturám či materiálům nebo jejich názvy? V Unity tohle teda není potřeba. Pokud mám vytvořený prefab tak vše je vytvořeno dopředu jen vytvořím instanci a nastavím parametry a nic víc řešit nemusím a ty co budou ve hře fyzicky získám podle UID.

Nahlásit jako SPAM
IP: 193.138.154.–
MilanL+1
Expert
5. 12. 2019   #12
-
0
-

#11 Mutagen
to je takový problém tu hlavičku zeserializovat zvlášť a až za ní uložit třídu hry?

pak do seznamu ze stremu souboru načteš vždy jen tu hlavičku a soubor zavřeš.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Expert
5. 12. 2019   #13
-
0
-

hlavička může být i v té třídě, jen nebude v té serializable sekci.

v metodě save pak nejdříve do streamu pošleš hlavičku a pak zbytek třídy, jiná věc je pak ošetření délky jmen hry a hráče, při serializaci budeš muset jít nejspíš přes pevnou délku.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Expert
5. 12. 2019   #14
-
0
-

kdybych šel ještě víc do detailů, tak v té hlavičce co jsi chtěl kombinuješ data, která by v podstatě měla být součástí 2 tříd třídy hry (herní čas název apod) a třídy hráč (jméno hráče, level)

Nahlásit jako SPAM
IP: 185.112.167.–
Mutagen
~ Anonymní uživatel
489 příspěvků
6. 12. 2019   #15
-
0
-

#12 MilanL
Já prostě nepochopím proč mě tu pořád snažíš přesvědčit, že to "řeším" špatně. To, že si to rozdělím do 2 souborů ještě nutně neznamená, že ty data (herní čas a level) jsou nutné v tom hlavním save souboru a kdyby náhodou jo, tak není problém to tam přidat. Nejsem vývojář pár měsíců (v Unity možná ano přesněji 8), ale to rozhodně neznamená, že to co mám vymyšlený je špatně. Jednoduše prostě nechci v menu načítat velký soubory, protože vím, že to je akorád zdržování a žraní paměti, daleko lepší je si přečíst 1 file kde máš HeaderInfo od každého save souboru a při výběru se odkážu jen na ten hlavní saveFile. Osobně v tom nevidím vůbec nic špatně. Načtení 1souboru o velikosti pár kB vs načtení (až) xx souborů o velikosti např 10-20mB.

Tak jak jsem napsal to funguje dokonale a bez zbytečných problémů a to jsme se od původní otázky, na kterou jsem napsal, že Ok rozumím nejde to (asi 3 nebo 4 příspěvek) docela dost vzdálilo a podle mě úplně zbytečně se to řeší :)

Nahlásit jako SPAM
IP: 193.138.154.–
MilanL+1
Expert
6. 12. 2019   #16
-
0
-

#15 Mutagen
OK.

Nikde neříkám že to řešíš špatně, možná ta formulace odpovědí k tomu svádí,

Jen jsem uvedl, že to má řešení i v rámci toho souboru hry a není při tom třeba načítat celý soubor, stačí jen kus začátku, že otevřeš soubor jako stream a z něho deserializuješ hlavičku co je na začátku neznamená, že se bude načítat víc než je potřeba na tu hlavičku.

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Expert
6. 12. 2019   #17
-
0
-

Ono těch možností je vícero, někdo dává celou hru do 1 souboru jiný udělá složku a data hry rozdělí do více souborů podle funkčních částí např  mapy/prostředí, objekty statiských, náhodných, entity, data Hráče/Hráčů.

Každý ten způsob má něco do sebe, u toho rozdělení vidím výhodu při vývoji - snadněji se odhalí případné chyby a nedostatky.

Nahlásit jako SPAM
IP: 91.139.9.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 20 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032020 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý