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

Т.е : Имам главна форма и форма за опции която примерно е в vew->options.
Въпроса е как след като тази Options forma се затвори да помни настройките на усера(примерно кои чекбоксове е отметнал , позиция на формата и т.н.).
Реших да я сериализирам обаче има ли начин да сериализирам клас след като неговия базов не е сериализируем ?Т.е да сериализирам само някои от неговите полета а след това да извикам Serialize() функция на класа ?
Най - лесното което ес сещам е да си реализирам структура State и на Form_Close да я save-на в public променлива на Main formata.Обаче това изобщо не е универсално решение.
Надявам се да имате някакви идеи .
Редактирано от AiSiktiriks на
Re: Serialize
Аз бих ти препоръчал да си направиш клас, в който да си държиш настройките и като затваряш формата да я "синхронизираш" с обекта. Ако не искаш нещо да не се сериализира можеш да ползваш [XmlIgnore] атрибута.
If you don't care where you are going any road will get you there
If you don't care where you are going any road will get you there
Re: Serialize
това е ясно, ама човека иска нещо универсално, тоест да не трябва да си правиш отделен клас за всяка форма, а да ползваш един подход за всички форми
аз лично не се сещам за нещо готово, но това което може да направиш е да си напишеш две функции (myFormSerialize и myFormDeserialize). първата ти обикаля child контролите по формата вижда какъв вид и им взима value-то и го сериализира. това ще работи за всяка форма ама си е доста писане (е, не чак толко ако си маниак). по интересното е десериализацията, защото трябва да намериш за всеки контрол точно неговата стоиност, но и това е решим проблем, тъй като всеки контрол има индентификатор, нужно е да го сериализираш и него и после лесно ще го намериш при десериализацията. най-добре е да ползваш xml. значи при сериализацията обикаляш контролите и рендерираш xml-а, а при десериализацията четеш xml-а и намираш контролите и им даваш стойности.
съжалявам че нямам време сега, но като имам ще ти пост-на малко сорс код да видиш точно какво имам впредвид
но все пак проучи нещата по-добре, може пък и да има нещо готово което сериализира форми, аз малко си падам тип "абе по-добре аз да си го напиша"
... всмисъл и да има нещо готово то ще работи на този принцип който ти описах, така че ако си маниак просто сядаш и си го написваш 
XM TurboCT .. where comfort meets power
аз лично не се сещам за нещо готово, но това което може да направиш е да си напишеш две функции (myFormSerialize и myFormDeserialize). първата ти обикаля child контролите по формата вижда какъв вид и им взима value-то и го сериализира. това ще работи за всяка форма ама си е доста писане (е, не чак толко ако си маниак). по интересното е десериализацията, защото трябва да намериш за всеки контрол точно неговата стоиност, но и това е решим проблем, тъй като всеки контрол има индентификатор, нужно е да го сериализираш и него и после лесно ще го намериш при десериализацията. най-добре е да ползваш xml. значи при сериализацията обикаляш контролите и рендерираш xml-а, а при десериализацията четеш xml-а и намираш контролите и им даваш стойности.
съжалявам че нямам време сега, но като имам ще ти пост-на малко сорс код да видиш точно какво имам впредвид
но все пак проучи нещата по-добре, може пък и да има нещо готово което сериализира форми, аз малко си падам тип "абе по-добре аз да си го напиша"
XM TurboCT .. where comfort meets power
Re: Serialize
Ясно е, че иска нещо универсално, но в много случаи намирането на общо решение се оказва сериозно отклонение от основната задача. Но ако му се занимава на човек
и не гони срокове...

If you don't care where you are going any road will get you there
If you don't care where you are going any road will get you there
Re: Serialize
Само не мога да схвана Options които са само за live-time на application-a чии са потребни ... и ако не са такива защо не си ги пише някъде в config или options file и чете от там съответно. А за опции които се достъпват динамично си се прави я стек я обект квото ти кефни и си имат метод реферш.
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.

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.
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
поне аз така разбрах
ама аз се чудя друго защо не ползва атрибута [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
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 :(

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 :(
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.
Не насилвайте нещата - вземете по-голям чук.
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.
Не насилвайте нещата - вземете по-голям чук.
Re: Serialize
аааааааааааааааа...
Колкото повече,толкова повече!
Колкото повече,толкова повече!
Редактирано от sunny на