Serialize

11 отговора 353 прегледа
#1

Serialize

Искам да намеря универсално решение за Save and Restore State на win form.
Т.е : Имам главна форма и форма за опции която примерно е в vew->options.
Въпроса е как след като тази Options forma се затвори да помни настройките на усера(примерно кои чекбоксове е отметнал , позиция на формата и т.н.).
Реших да я сериализирам обаче има ли начин да сериализирам клас след като неговия базов не е сериализируем ?Т.е да сериализирам само някои от неговите полета а след това да извикам Serialize() функция на класа ?
Най - лесното което ес сещам е да си реализирам структура State и на Form_Close да я save-на в public променлива на Main formata.Обаче това изобщо не е универсално решение.
Надявам се да имате някакви идеи .

Редактирано от AiSiktiriks на

Отговор
в отговор на AiSiktiriks #2

Re: Serialize

ima 1 pattern - 'memento'. mislq che shte e podhodqsht v sluchaq

Отговор
в отговор на AiSiktiriks #3

Re: Serialize

Аз бих ти препоръчал да си направиш клас, в който да си държиш настройките и като затваряш формата да я "синхронизираш" с обекта. Ако не искаш нещо да не се сериализира можеш да ползваш [XmlIgnore] атрибута.

If you don't care where you are going any road will get you there
Отговор
в отговор на antipop #4

Re: Serialize

това е ясно, ама човека иска нещо универсално, тоест да не трябва да си правиш отделен клас за всяка форма, а да ползваш един подход за всички форми

аз лично не се сещам за нещо готово, но това което може да направиш е да си напишеш две функции (myFormSerialize и myFormDeserialize). първата ти обикаля child контролите по формата вижда какъв вид и им взима value-то и го сериализира. това ще работи за всяка форма ама си е доста писане (е, не чак толко ако си маниак). по интересното е десериализацията, защото трябва да намериш за всеки контрол точно неговата стоиност, но и това е решим проблем, тъй като всеки контрол има индентификатор, нужно е да го сериализираш и него и после лесно ще го намериш при десериализацията. най-добре е да ползваш xml. значи при сериализацията обикаляш контролите и рендерираш xml-а, а при десериализацията четеш xml-а и намираш контролите и им даваш стойности.

съжалявам че нямам време сега, но като имам ще ти пост-на малко сорс код да видиш точно какво имам впредвид

но все пак проучи нещата по-добре, може пък и да има нещо готово което сериализира форми, аз малко си падам тип "абе по-добре аз да си го напиша" ... всмисъл и да има нещо готово то ще работи на този принцип който ти описах, така че ако си маниак просто сядаш и си го написваш


XM TurboCT .. where comfort meets power
Отговор
в отговор на шeф нa Coди Дeвня #5

Re: Serialize

Ясно е, че иска нещо универсално, но в много случаи намирането на общо решение се оказва сериозно отклонение от основната задача. Но ако му се занимава на човек и не гони срокове...

If you don't care where you are going any road will get you there
Отговор
в отговор на шeф нa Coди Дeвня #6

Re: Serialize

Само не мога да схвана Options които са само за live-time на application-a чии са потребни ... и ако не са такива защо не си ги пише някъде в config или options file и чете от там съответно. А за опции които се достъпват динамично си се прави я стек я обект квото ти кефни и си имат метод реферш.

Отговор
в отговор на AiSiktiriks #7

Re: Serialize

Thanks na vsi4ki za mneniqta!

Ta doidoha mi dosta idei i sega razrabotvam Class koito ve4e raboti dosta dobre no ne e zawur6en.Glawno s reflection se raboti kakto se dose6tate i e universalen
t.e vuv vsqka forma dobavqte samo 1 red kod i ve4e se sledi.
Kato go zavur6a 6te postna sus sigurnost 6te ima dosta prilojeniq.

Отговор
в отговор на Minavasht #8

Re: Serialize

няма значение къв е глобалния проблем на човека ... важното е че иска да сериализира форми ... Options го дава само като пример

поне аз така разбрах

ама аз се чудя друго защо не ползва атрибута [Serializable], примерно:


[Serializable]
public class myForm
{
...
};

и ползва [NonSerialized] за мембъри които не иска да сериализира, после сериализира и десериализира така:

myForm form = new myForm();

FileStream fs = File.Create("myform.dat");
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs,form);
fs.Close();

fs = File.OpenRead("myform.dat");
form=(myForm)bf.Deserialize(fs);
fs.Close();

Всъщност, атрибута [Serializable] ти гарантира че един обект от дадения клас може да бъде съхранен и съответно възстановен. Това става като по време на изпълнение (run-time) преди сериализацията се прави граф на обектите които сериализируемия обект реферира. Тука трябва да се внимава защото като се изграждат линковете на този граф не се проверява дали няма зацикляне, и примерно при един клас който съдържа референс към друг клас, а пък другия клас съдържа референс към първия, много лесно това може да се превърне в безсънни нощи на дебъгване. Освен това обектите в този граф не са свързани във същата йерархия в която са дефинирани в класа, а се линкват по начина по който JIT-а реши че е най-добре. Освен това може сам да си зададеш формата в който ще сериализираш - binary или SOAP. Независимо кой ползваш, форматера ти е класа който ти извършва сериализацията. Тоест: обект -> форматер -> файл. Просто единия ще ти сериализира xml, а другия binary.

Но както казах и в предишния ми пост, не знам това доколко ще работи с форми, защото там нещата са малко по-сложни с разните му инициализации и други. Затова аз винаги бих предпочел това което предложих в предния ми пост, тоест: обхождаш контролите по формата, сериализираш (ID-value) и после десериализираш. Това може да стане и като формата наследява ISerializable интерфейс, чийто custom имплементация ще се грижи всеки контрол да си сериализира ID-то и value-то и после съответно по ID-то да си намери value-то.

абе това е дъ хард уей както се казва ...


XM TurboCT .. where comfort meets power
Отговор
в отговор на шeф нa Coди Дeвня #9

Re: Serialize

[Serializable] da dosta prou4vah vuprosa no s windows form ne6tata sa mai dosta slojni.
Directno vse o6te ne sum nameril na4in da markiram moq forma kato [Serializable]

t.e dokolkoto znam ako ima6 bazov klass koito ne e [Serializable]
to ne moje6 da markira6 naslednika kato takuv - pone az ne sum razbral kak.Ina4e naistina tova e perfectnoto re6enie.

Posle se zamislih na variant 2:
kogato realiziram svoq foma(tuk govorim ne samo za formi a za vsqkakvi componenti) markiram sus [MySerializable] i posle mu mislq kakvo 6te gi pravq.Lo6oto e 4e neznam kak da nakaram coreto da ba4ka za mene , t.e da vur6i trasirane i t.n.

Vsqkakvi idei sa dobre do6tli.

Za sujalenie v momenta ne pravq ni6to po vuprosa za6toto mi izleze vajen proj :(

Отговор
в отговор на AiSiktiriks #10

Re: Serialize

I kvo tolkova otrazqvash hehe?
Zombie will get u!

Отговор
в отговор на AiSiktiriks #11

Re: Serialize

t.e dokolkoto znam ako ima6 bazov klass koito ne e [Serializable]
to ne moje6 da markira6 naslednika kato takuv - pone az ne sum razbral kak.Ina4e naistina tova e perfectnoto re6enie.


Ами заощо не пробваш
public class MyForm : System.Windows.Forms.Form , System.Runtime.Serialization.ISerializable {
...
}
Toва 4е базовия клас, не го имплементира, не зна4и 4е и ти не може6.

Не насилвайте нещата - вземете по-голям чук.
Отговор
в отговор на s_dimi #12

Re: Serialize

аааааааааааааааа...

Колкото повече,толкова повече!

Редактирано от sunny на

Отговор