<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=59&amp;t=15843&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-07-23T21:54:12+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=59&amp;t=15843&amp;mode</id>
<entry>
<author><name><![CDATA[komandos332]]></name></author>
<updated>2016-07-23T21:54:12+01:00</updated>
<published>2016-07-23T21:54:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164633#p164633</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164633#p164633"/>
<title type="html"><![CDATA[Re: C# W końcu! Serializacja (Zapis do pliku) kontrolek Wind]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164633#p164633"><![CDATA[
Czym jest pełna kontrola?<br />Chodzi o to, że kiedy na formatce np będzie Panel, który ma inne panele, które mają inne panele które mają GroupBoxy które mają inne kontrolki to to nie zadziała przy deserialziacji?<br />Nie wziąłem tego pod uwagę. Musze to od nowa przemyśleć. Chyba, że chodzi Ci o coś innego? <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Podpowiedz, chętnie postaram się to rozgryźć <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4299">komandos332</a> — 23 lip 2016, o 21:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2016-07-23T21:29:08+01:00</updated>
<published>2016-07-23T21:29:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164631#p164631</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164631#p164631"/>
<title type="html"><![CDATA[Re: C# W końcu! Serializacja (Zapis do pliku) kontrolek Wind]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164631#p164631"><![CDATA[
owszem standardowy mechanizm którego uzywasz jest ok , ale nie daje pełnej kontroli <br />i to może stanowić problem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 23 lip 2016, o 21:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[komandos332]]></name></author>
<updated>2016-07-23T21:23:51+01:00</updated>
<published>2016-07-23T21:23:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164630#p164630</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164630#p164630"/>
<title type="html"><![CDATA[Re: C# W końcu! Serializacja (Zapis do pliku) kontrolek Wind]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164630#p164630"><![CDATA[
Nie korzystałem z tego interfejsu. Aczkolwiek wydaje mi się, że tą metodą którą przedstawiłem dało by się zserializować dosłownie wszystko dzięki bibliotece Reflection.<br />Do stworzenia obiektu danej klasy nie powinno mi być potrzebne nic oprócz jego właściwości. Metoda GetProperties() daje mi wszystko czego potrzebuję, w każdym przypadku.<br />Nie wiem jak z obiektami klas które nie mają publicznego konstruktora. Nie próbowałem za pomocą Activator.CreateInstance() tworzyć takiego obiektu. Ciekaw jestem co by z tego wyszło <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br />Na przykład <span style="color: #00BFFF">PropertyInfo</span>. Nie da się napisać PropertyInfo pInfo = new PropertyInfo(). Nawet podczas tworzenia obiektu z publicznym konstruktorem, który<br />wymaga podania jakichś parametrów należy je podać za pomocą tablicy object[]. Jeżeli tego się nie zrobi to dostaniemy wyjątek &quot;Nie odnaleziono konstruktora.. blablabla&quot;.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4299">komandos332</a> — 23 lip 2016, o 21:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2016-07-23T21:14:44+01:00</updated>
<published>2016-07-23T21:14:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164627#p164627</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164627#p164627"/>
<title type="html"><![CDATA[Re: C# W końcu! Serializacja (Zapis do pliku) kontrolek Wind]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164627#p164627"><![CDATA[
otóż to ,...<br />Dlatego wygodniej jest użyć metody niestandardowej serializacji  realizowanej poprzez interfejs ISerializable. W tym interfejsie znajdziesz konstuktora metody  GetObjectData() <br /><br />....  <br /><br /><img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 23 lip 2016, o 21:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[komandos332]]></name></author>
<updated>2016-07-23T20:57:45+01:00</updated>
<published>2016-07-23T20:57:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164623#p164623</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164623#p164623"/>
<title type="html"><![CDATA[Re: C# W końcu! Serializacja (Zapis do pliku) kontrolek Wind]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164623#p164623"><![CDATA[
Jak zatem dodać do klasy Button atrybut [Serializble]? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Nie ma możliwości edycji klasy sealed takiej jak przykładowo Button.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4299">komandos332</a> — 23 lip 2016, o 20:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2016-07-23T20:50:48+01:00</updated>
<published>2016-07-23T20:50:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164620#p164620</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164620#p164620"/>
<title type="html"><![CDATA[Re: C# W końcu! Serializacja (Zapis do pliku) kontrolek Wind]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164620#p164620"><![CDATA[
Tak Serializacja nie tylko w C# odgrywa często kluczową rolę w wielu funkcjach i usługach.<br />Oczywiście często niestety i ja jako developer muszę wykonywać niestandardową serializacje  tylko po to by mieć pełną kontrolę nad procesami zarówno samej seroializacji jak i deserializacji.  <br />I tu używanie standardowych procesów serializacji z .Net jest niewystarczające .<br /><br />Zauważ że funkcja serializacji w .Net  jest stosunkowo nowa , wcześniej jedyna metodą było<br />przechowywanie obiektów klasy poprzez przepisanie ich do strumienia , ale to rowiązanie choć proste ma 2 wady lub jak wolisz konsekwencje:<br /><br />1. Trzeba napisać kod dla każdego obiektu , jeśli masz ich więcej  zdefiniowanych jako typ zawierający kilka obiektów i robi się to wszystko zagmatwane ....<br />2. jesli chcesz wprowadzić zmiany do obiektów klasy  to musisz tez zmienic kod przechowywania <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />ale wszystko znajdziesz w msdn <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Pamiętaj o użyciu IDSerializationCallback  bu przeliczyć obiekty zawłaszcza gdy zostaną rozszeregowane <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Oraz o odpowiednim doborze formatera obiektów  BinaryFormatter i SoapFormatter  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 23 lip 2016, o 20:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[komandos332]]></name></author>
<updated>2016-07-23T17:40:15+01:00</updated>
<published>2016-07-23T17:40:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164611#p164611</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164611#p164611"/>
<title type="html"><![CDATA[C# W końcu! Serializacja (Zapis do pliku) kontrolek Windows!]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=15843&amp;p=164611#p164611"><![CDATA[
Witam wszystkich!<br /><br />Na starcie powiem, iż jestem bardzo szczęśliwy. Do tego stopnia szczęśliwy, że aż muszę się z Wami tym podzielić.<br />Procuję teraz nad pewnym programem, kto wie ten wie. Potrzebuję w nim udostępnić możliwość stworzenia własnej formatki.<br />Zmagałem się już kiedyś z tym problemem, ale to olałem bo znalazłem inne rozwiązanie tamtego problemu. Dziś jednak nie mogłem<br />się bez tego obejść. Konkretnie chodzi o serializacje Windowsowych kontrolek takich jak Button, ComboBox etc..<br />Bardzo długo szukałem jakiegoś rozwiązania w sieci zarówno naszej polskiej jak i zagranicznej. Nie spotkałem się jednak z żadnym konkretem<br />który by opisywał: TAK MASZ ZROBIĆ I BĘDZIE DOBRZE. Zatem będę pierwszy. Być może jest ktoś, kto takie rozwiązanie znalazł, jeśli tak<br />to poproszę <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Lecimy, na początku stworzyłem sobie baaardzo prostą klasę <span style="color: #00BFFF">PropertyContainer</span>.<br />Oto jej kod:<br />[syntax=csharp]&#91;Serializable&#93;<br />    public class PropertyContainer<br />    {<br />        public string PropertyName { get; set; }<br />        public object PropertyValue { get; set; }<br />        public Type  PropertyParentType { get; set; }<br />    }[/syntax]<br /><br />Pozwoliła mi ona na zapis podstawowych danych o właściwości.<br /><br />Do serializacji naszych kontrolek będziemy musieli zaopatrzyć się w następujące biblioteki:<br />[syntax=csharp]using System.IO;<br />using System.Reflection;<br />using System.Runtime.Serialization.Formatters.Binary;[/syntax]<br /><br />Kod serializacji. Mam nadzieję, że ładnie opisany.<br />[syntax=csharp]private void buttonSerialize_Click ( object sender, EventArgs e )<br />        {<br /><br />            List&lt;List&lt;PropertyContainer&gt;&gt; controlsProperties = new List&lt;List&lt;PropertyContainer&gt;&gt;(); //Dwuwymiarowy listing obiektów klasy PropertyContainer<br /><br />            foreach ( Control ctrl in this.Controls ) //Lecimy po wszystkich kontrolkach naszej formatki.<br />            {<br />                <br />                PropertyInfo&#91;&#93; pInfos = ctrl.GetType().GetProperties(); //Klasa PropertyInfo z biblioteki Reflection<br />                <br />                List &lt; PropertyContainer &gt; ctrlProps = new List&lt;PropertyContainer&gt;(); //Nowy listing klasy PropertyContainer, który będzie przechowywał właściwości JEDNEJ kontrolki.<br /><br />                foreach (PropertyInfo pInfo in pInfos) //Lecimy po wszystkich właściwościach kontrolki ctrl;<br />                {<br />                    try //Niestety musiałem tego użyć, z niewiadomych przyczyn właściwość IsSerializable w niektórych właściwościach w ogóle nie ma i wywalało NullReferenceException<br />                    {<br />                        if ( pInfo.GetValue ( ctrl ).GetType ( ).IsSerializable ) //Jeżeli typ naszej właściwości jest możliwy do serializacji.<br />                        {<br />                            PropertyContainer pCont = new PropertyContainer(); //Nowy obiekt klasy PropertyContainer<br />                            pCont.PropertyName = pInfo.Name; //Zapisujemy nazwę właściwości<br />                            pCont.PropertyValue = pInfo.GetValue ( ctrl ); //Zapisujemy wartość właściwości<br />                            pCont.PropertyParentType = ctrl.GetType ( ); //Zapisujey typ obiektu, który ową właściwość posiada. Przyda się później.<br />                            ctrlProps.Add ( pCont ); //Dodajemy nasz obiekt PropertyContainer do wcześniej utworzonego listingu.<br />                        }<br />                    }<br />                    catch { } // :/ Nie lubię tego używać...<br />                }<br />                controlsProperties.Add ( ctrlProps ); //Dodajemy do głównego listingu listing z właściwościami obiektu.<br />            }<br /><br />            FileStream fStream = new FileStream ( Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + &quot;\\AllFormControlsSerialized.dat&quot;, FileMode.Create); // Strumień do pliku<br />            BinaryFormatter bf = new BinaryFormatter(); // Serializator :D <br />            bf.Serialize ( fStream, controlsProperties ); // No i serializacja.<br />            fStream.Close ( ); //Nie zapominamy o zamknięciu strumienia!<br />        }[/syntax]<br /><br />Kod deserializacji:<br />[syntax=csharp]private void buttonDeserialize_Click ( object sender, EventArgs e )<br />        {<br />            FileStream fStream = new FileStream ( Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + &quot;\\AllFormControlsSerialized.dat&quot;, FileMode.Open); //Strumień do pliku<br />            BinaryFormatter bf = new BinaryFormatter(); // Sierializator :D<br />            List&lt;List&lt;PropertyContainer&gt;&gt; loadedControlsProperties = bf.Deserialize ( fStream ) as List&lt;List&lt;PropertyContainer&gt;&gt;; // No i deserializacja.<br />            fStream.Close ( ); // Znowu nie zapominamy o zamknięciu strumienia.<br /><br />            foreach ( List&lt;PropertyContainer&gt; pConts in loadedControlsProperties ) // Iterujemy nasz Listing który zawieta Listing klasy PropertyContainer<br />            {<br /><br />                Control control = Activator.CreateInstance(pConts&#91;0&#93;.PropertyParentType) as Control; //Bardzo fajna rzecz. Pozwala utworzyć instancję obiektu znając jedynie jej typ<br />                                                                                                     //albo nawet nie znając. Można zrobić object btn = new Button(); i zamiast<br />                                                                                                     //podawać konkretny typ, sam sobie sprawdzi jakiego typu jest obiekt i utworzy nam<br />                                                                                                     //nową instancję tego typu. Dlatego potrzebna była właściwość PropertyParentType<br />                                                                                                     //w klasie PropertyContainer.<br />                foreach ( PropertyContainer pCont in pConts ) //Lecimy po właściwościach.<br />                {<br />                    try //Znowu to brzydkie Try Catch było potrzebne... :/<br />                    {<br />                        control.GetType ( ).GetProperty ( pCont.PropertyName ).SetValue ( control, pCont.PropertyValue ); //Znowu wspaniała biblioteka Reflection. Wpisujemy wartości<br />                                                                                                                          //właściwości do właściwości nowo utworzonego obiektu.<br />                    }<br />                    catch<br />                    {<br /><br />                    }<br />                }<br />                this.Controls.Add ( control ); //Dodajemy naszą zdeserializowaną kontrolkę do formatki!!!! Wsio rybko i działa pięknie!<br />            }<br /><br />        }[/syntax]<br /><br />Następną rzeczą jaką się w tym zajmę, będzie serializacja Eventów kontrolek. Nie wiem czy mam dziś siły ale spróbuję.<br />Jeżeli mi się powiedzie, to chcecie?<br /><br />Pozdrawiam serdecznie wszystkich użytkowników! Maciek <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4299">komandos332</a> — 23 lip 2016, o 17:40</p><hr />
]]></content>
</entry>
</feed>