Mam następującą metodę zapisania obiektu do pliku:
// Save an object out to the disk
public static void SerializeObject<T>(this T toSerialize, String filename)
{
XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
TextWriter textWriter = new StreamWriter(filename);
xmlSerializer.Serialize(textWriter, toSerialize);
textWriter.Close();
}
Przyznaję, że go nie napisałem (przekonwertowałem go tylko na metodę rozszerzenia, która przyjęła parametr typu).
Teraz muszę go zwrócić z powrotem xml jako ciąg znaków (zamiast zapisywać go w pliku). Patrzę na to, ale jeszcze tego nie rozgryzłem.
Pomyślałem, że może to być naprawdę łatwe dla kogoś, kto zna te przedmioty. Jeśli nie, w końcu to rozwiążę.
źródło
typeof(T)
kontratoSerialize.GetType()
, zrób to, ale nie w mojej odpowiedzi. Dzięki.Wiem, że tak naprawdę nie jest to odpowiedź na pytanie, ale na podstawie liczby głosów na pytanie i przyjętej odpowiedzi podejrzewam, że ludzie faktycznie używają kodu do serializacji obiektu na ciąg.
Zastosowanie serializacji XML dodaje niepotrzebne dodatkowe śmieci tekstowe do wyniku.
Dla następnej klasy
generuje
Lepszym rozwiązaniem jest zastosowanie serializacji JSON (jedną z najlepszych jest Json.NET ). Aby serializować obiekt:
Aby dokonać deserializacji obiektu:
Serializowany ciąg JSON wyglądałby następująco:
źródło
Serializacja i deserializacja (XML / JSON):
źródło
Kod Uwaga bezpieczeństwa
Jeśli chodzi o przyjętą odpowiedź , ważne jest, aby użyć
toSerialize.GetType()
zamiasttypeof(T)
wXmlSerializer
konstruktorze: jeśli użyjesz pierwszego, kod obejmie wszystkie możliwe scenariusze, podczas gdy użycie drugiego niekiedy się nie powiedzie.Oto link z przykładowym kodem, który motywuje tę instrukcję, z
XmlSerializer
rzuceniem wyjątku, gdytypeof(T)
jest używany, ponieważ przekazujesz instancję typu pochodnego do metody, która wywołujeSerializeObject<T>()
definicję w klasie bazowej typu pochodnego: http: // ideone .pl / 1Z5J1 . Należy pamiętać, że Ideone używa Mono do wykonania kodu: faktyczny wyjątek, który można uzyskać przy użyciu środowiska wykonawczego Microsoft .NET, ma inną wiadomość niż ta wyświetlana w Ideone, ale kończy się tak samo.Ze względu na kompletność zamieszczam tutaj pełną próbkę kodu do wykorzystania w przyszłości, na wypadek gdyby Ideone (gdzie zamieściłem kod) stał się niedostępny w przyszłości:
źródło
using (StringWriter textWriter = new StringWriter() {}
dla właściwego zamknięcia / usunięcia obiektu.using
oświadczenie jest najlepszym przyjacielem zarówno dla nas, jak i dla naszych drogichIDisposable
obiektów wykonawczych;)My 2p ...
źródło
źródło
Nie mogłem użyć metody JSONConvert sugerowanej przez xhafan
W .Net 4.5 nawet po dodaniu odwołania do zestawu „System.Web.Extensions” nadal nie mogłem uzyskać dostępu do JSONConvert.
Jednak po dodaniu odwołania możesz wydrukować ten sam ciąg znaków, używając:
źródło
Czułem, że muszę udostępnić ten zmanipulowany kod do zaakceptowanej odpowiedzi - ponieważ nie mam reputacji, nie mogę komentować ..
źródło
W niektórych rzadkich przypadkach możesz zaimplementować własną serializację ciągów.
Ale to prawdopodobnie zły pomysł, chyba że wiesz, co robisz. (np. serializacja dla I / O za pomocą pliku wsadowego)
Coś takiego wystarczyłoby (i byłoby to łatwe do edycji ręcznie / wsadowo), ale uważaj, aby wykonać więcej kontroli, ponieważ ta nazwa nie zawiera nowego wiersza.
źródło
[VB]
[DO#]
źródło