serializovat objekt na řetězec
<p>mám následující metodu uložit objekt do souboru:</p><pre><code>// save an object out to the disk public static void serializeobject&lt;t&gt;(this t toserialize, string filename) { xmlserializer xmlserializer = new xmlserializer(toserialize.gettype()); textwriter textwriter = new streamwriter(filename); xmlserializer.serialize(textwriter, toserialize); textwriter.close(); } </code></pre><p>přiznávám, že jsem to nezapisoval (konvertoval jsem ho pouze na metodu rozšíření, která měla parametr typu).</p><p>teď to potřebuju, aby mi xml vrátil jako řetězec (místo abych ho uložil do souboru). dívám se do ní, ale ještě jsem to nenapadlo.</p><p>myslel jsem, že to může být pro někoho, kdo je obeznámen s těmito objekty, opravdu snadné. pokud ne, nakonec to přijdu.</p>
<p>použít <a href="http://msdn.microsoft.com/en-us/library/system.io.stringwriter.aspx"><code>stringwriter</code></a> namísto souboru <a href="http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx"><code>streamwriter</code></a> :</p><pre><code>public static string serializeobject&lt;t&gt;(this t toserialize) { xmlserializer xmlserializer = new xmlserializer(toserialize.gettype()); using(stringwriter textwriter = new stringwriter()) { xmlserializer.serialize(textwriter, toserialize); return textwriter.tostring(); } } </code></pre><p>poznámka: je důležité použít <code>toserialize.gettype()</code> namísto <code>typeof(t)</code> v konstruktoru xmlserializer: pokud použijete první, kód pokrývá všechny možné podtřídy <code>t</code> (které jsou pro metodu platné), zatímco druhý z nich selže při předávání typu odvozeného z <code>t</code>. zde je odkaz s nějakým příkladem kódu, který motivuje toto prohlášení, s <code>xmlserializer</code> házením <code>exception</code>, když je <code>typeof(t)</code> použito, protože předáte instanci odvozeného typu metodě, která volá serializeobject, který je definované v základní třídě odvozeného typu: <a href="http://ideone.com/1z5j1">http://ideone.com/1z5j1</a> .</p><p>ideone také používá mono ke spuštění kódu; skutečný <code>exception</code> byste dostali pomocí runtime microsoft .net má jiný <code>message</code> než ten, který je zobrazen na ideone, ale to selže stejně.</p>
<p>předpokládejme, že máme soubor test.xsd, který vypadá takto:</p><pre><code>&lt;?xml version="1.0"?&gt; &lt;xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"&gt; &lt;xs:element name="myclass"&gt; &lt;xs:complextype&gt; &lt;xs:sequence&gt; &lt;xs:element name="field1" type="xs:string"/&gt; &lt;xs:element name="field2" type="xs:string"/&gt; &lt;/xs:sequence&gt; &lt;/xs:complextype&gt; &lt;/xs:element&gt; &lt;/xs:schema&gt; </code></pre><ol> <li><p>vytváření tříd pomocí nástroje xsd:</p> <pre><code>xsd.exe /classes test.xsd </code></pre> <p>to vygeneruje soubor test.cs.</p></li> <li><p>přidat soubor test.cs do řešení.</p></li> <li><p>vytvořit instanci <code>myclass</code>, definovanou ve schématu xsd a xmlserialize:</p> <pre><code>using system.xml.serialization; // ... var data = new myclass { field1 = "test1", field2 = "test2" }; var serializer = new xmlserializer(typeof(myclass)); using (var stream = new streamwriter("c:\\test.xml")) serializer.serialize(stream, data); </code></pre></li> </ol><p>výsledek:</p><pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;myclass xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"&gt; &lt;field1&gt;test1&lt;/field1&gt; &lt;field2&gt;test2&lt;/field2&gt; &lt;/myclass&gt; </code></pre> <p>můžete použít nástroj k převodu externího stylu na vložené šablony stylů, jako například pro e-mailový marketing a další oblasti, kde je inlinestyling jedinou možností</p><ul> <li> <a href="http://inlinestyler.torchboxapps.com/styler/">http://inlinestyler.torchboxapps.com/styler/</a> </li> </ul> <p>použít výčet:</p><pre><code>public enum foo { instance; } </code></pre><p>joshua bloch vysvětlil tento přístup ve svém <a href="http://sites.google.com/site/io/effective-java-reloaded">efektivní java reloaded</a> talk na google i/o 2008: <a href="http://www.youtube.com/watch?v=pi\_i7od\_ugi#t=28m50s">odkaz na video</a> . viz také snímky 30-32 jeho prezentace ( <a href="https://14b1424d-a-62cb3a1a-s-sites.googlegroups.com/site/io/effective-java-reloaded/effective\_java\_reloaded.pdf?attachauth=anoy7crkcoet2neugw7rv1xfm-jn4z8yjhs0qjm11ohlrnfw\_jbexkjtvj3ujvte40dhaciywcriegj-n3flgnmoaphshhinh8iy05yviojozwzaohmtm-s4hci5kjreagi8awwtcyd0\_6g7ghkr2bndtoeqlk5sbhzcqfcyiyae5a4lgnosdcjodcbakjn8euo6572t2wu1lmseugjvqcf4i-fp6vdhdvih\_xueml9nuvjqynd2drpxyunh1spjspeidblw-wwz&amp;attredirects=0">effect\_java\_reloaded.pdf</a> ):</p><blockquote> <h3>správný způsob implementace serializovatelného singletonu</h3> <pre><code>public enum elvis { instance; private final string[] favoritesongs = { "hound dog", "heartbreak hotel" }; public void printfavorites() { system.out.println(arrays.tostring(favoritesongs)); } } </code></pre> </blockquote><p><strong>edit:</strong> an <a href="http://www.ddj.com/java/208403883?pgno=3">online část &quot;efektivní java&quot;</a> říká: </p><blockquote> <p>„tento přístup je funkčně ekvivalentní přístupu veřejného terénu, s výjimkou toho, že je výstižnější, poskytuje strojům serializace bezplatně a poskytuje bezchybnou záruku proti vícenásobné instanci, dokonce i v případě sofistikovaných serializačních nebo reflexních útoků. přesto být široce adoptovaný, <strong>jeden-element enum typu je nejlepší způsob, jak realizovat singleton</strong>.</p> </blockquote> <p>pokud je cílem cíl přidat dynamicky textová pole, ale stále potřebujete, aby uživatel příspěvek uložil/aktualizoval, nemusíte vůbec používat ajax.</p><p>stačí správně pojmenovat textová pole tak, aby pole hodnot bylo posted, a pak s ním zacházet v akci uložení.</p><p>to může být užitečné uložit toto pole do jednoho příspěvku meta klíč, takže můžete jen smyčka přes to výstup meta box.</p><p>uveďte &lt;div&gt;, který má podobu „slideshow\_metabox“.</p><p>nastavte počáteční textová pole takto:</p><pre><code>&lt;input type="text" style="position: relative; right: 0; width: 85%;" name="slideshow[]" value="&lt;?php echo $value; ?&gt;" /&gt; </code></pre><p>změňte nastavení kliknutím na tlačítko přidat:</p><pre><code>function() { jquery('#slideshow\_metabox').append('&lt;input type="text" style="position: relative; right: 0; width: 85%;" name="slideshow[]" value="" /&gt;'); } </code></pre><p>snad to pomůže.</p> <p>pokud potřebujete přidat opakovaně použitelnou metodu pro přidání textu, můžete vytvořit novou šablonu style/controltemplate, která obsahuje další blok textblock pro zobrazení textu. chcete-li nastavit text na pruhu průběhu, můžete přenést vlastnost textsearch.text. </p><p>pokud to nemusí být opakovaně použitelné, jednoduše umístěte ukazatel průběhu do mřížky a přidejte do mřížky textový blok. vzhledem k tomu, že wpf může skládat prvky dohromady, bude to fungovat pěkně.</p><p>pokud chcete, můžete vytvořit usercontrol, který zpřístupní progressbar a textblock jako veřejné vlastnosti, takže by bylo méně práce než vytvoření vlastní šablony controltemplate.</p> <p>děláme to úplně na <a href="http://smartystreets.com">smartystreets</a> . uživatelé nahrávají soubory s potenciálně miliony adres v nich a my je ověřujeme a standardizujeme/duplikujeme, atd. je to velmi náročné na procesor a dokonce i s kmenovými daty načtenými na jednotku ram, miliony adres zabere několik hodin (mimochodem, pro tuto částku je to velmi rychlé ...).</p><p>může být také důležité navrhnout uživatelské rozhraní, které může podporovat desítky úloh spuštěných paralelně. například naše serverové uzly se rozšiřují a můžeme podporovat mnoho souborů najednou. uživatelé budou potřebovat efektivní způsob, jak zobrazit stav a spravovat je. v roce 2011 jsme vylepšili naše uživatelské rozhraní a to je to, s čím jsme přišli.</p><hr><p> <a href="http://youtu.be/qdjsolatz4u?hd=1">zde je 30sekundové video</a> ukazující, jak celý proces funguje a jak rozhraní reaguje na aktuální stav úlohy (úloh). pokud chcete, můžete vyzkoušet sami od <a href="http://smartystreets.com/account/create">tato stránka</a> (zdarma, nebojte se ...).</p><hr><p>screenshoty pracovního postupu ... trvá asi 30 sekund až několik minut, v závislosti na vašich souborech.</p><p><img src="https://i.stack.imgur.com/egatr.png" alt="upload list"></p><p><em> nahrajte svůj seznam </em></p><p><img src="https://i.stack.imgur.com/kqkb9.png" alt="see the file uploading"></p><p><em> viz nahrání souboru </em></p><p><img src="https://i.stack.imgur.com/zv26q.png" alt="map the fields"></p><p><em> mapujte pole (probíhá automaticky; stačí potvrdit, že automatická mapa byla správná) </em></p><p><img src="https://i.stack.imgur.com/wodst.png" alt="stay up-to-date with the current status"></p><p><em> zůstaňte v kontaktu s tím, co se nyní děje </em></p><hr><p>všimněte si, že jakmile seznam začne zpracovávat, uživatel se může vrátit a nahrát více, které seznamy budou zpracovány paralelně v reálném čase. seznamy lze kdykoli zrušit/smazat a po dokončení je lze stáhnout. pokud byl seznam stažen alespoň jednou, zobrazí se zaškrtnutí.</p><p>toto je vlastně stárnoucí návrh, který plánujeme upgradovat. bude se to cítit spíš jako moderní, responzivní webová aplikace.</p><p>ještě stojí za zmínku, že jsme mnohokrát změnili vzhled stránky „dashboard“ účtu a tento návrh inicioval nejmenší volání/e-maily podpory a zákazníci to rádi viděli na první pohled. první uživatelé mají tendenci shledávat, že se s ním dostanou docela rychle.</p> I kdyby se vbox ztratil, je tam zalozni soubor pred posledni zmenou, jestli jsi jej fikane neprepsal stejne pojmenovanym strojem.Je to obycejne XML, takze si to otevri v textaku, nastuduj si, jak se tam eviduji snimky a dopln si do nej informace. <p>dlouhé řádky můžete rozdělit pomocí znaku <code>^</code>, pokud si pamatujete, že znak a nový řádek za ním jsou zcela odstraněny. takže, pokud by měl být mezera, kde prolomíte čáru, vložte mezeru. <em> ( <a href="https://stackoverflow.com/a/21000752/157247">více k tomu níže.</a> ) </em></p><p>příklad:</p><pre><code>copy file1.txt file2.txt </code></pre><p>bude psáno jako:</p><pre><code>copy file1.txt^ file2.txt </code></pre> Zkusil bych zazálohovat a tovární nastavení. Zmrazeni serie si clovek koupi dopredu. A sedi to v uctu do te doby nez to clovek potrebuje. Pak se to automaticky pouzije a serie se zmrazi na jeden den.