Mam odziedziczoną klasę C #. Pomyślnie „zbudowałem” obiekt. Ale muszę serializować obiekt do formatu XML. Czy jest na to łatwy sposób?
Wygląda na to, że klasa została skonfigurowana do serializacji, ale nie jestem pewien, jak uzyskać reprezentację XML. Moja definicja klasy wygląda następująco:
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.domain.com/test")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.domain.com/test", IsNullable = false)]
public partial class MyObject
{
...
}
Oto, co myślałem, że mogę zrobić, ale to nie działa:
MyObject o = new MyObject();
// Set o properties
string xml = o.ToString();
Jak uzyskać reprezentację XML tego obiektu?
c#
xml-serialization
użytkownik462166
źródło
źródło
Odpowiedzi:
Musisz użyć XmlSerializer do serializacji XML. Poniżej znajduje się przykładowy fragment kodu.
źródło
XmlWriter writer = XmlWriter.Create(sww);
XmlTextWriter writer = new XmlTextWriter(sww) { Formatting = Formatting.Indented };
zamiastXmlWriter writer = XmlWriter.Create(sww);
XmlWriter
enkapsulujeStringWriter
, nie musisz usuwać obu (pierwsze użycie jest zbędne), prawda? Zakładam, żeXmlWriter
się tym pozbywam ...XmlWriter
nie opisujeStringWriter
, wykorzystuje swoje dane osoboweStringWriter
i nie ma żadnych oczekiwań / odpowiedzialności za ich usunięcie. Co więcej,StringWriter
jest pozaXmlWriter
zakresem, możesz nadal chcieć, gdyXmlWriter
zostanie wyrzucony, byłoby złym zachowaniem,XmlWriter
aby pozbyć się twojegoStringWriter
. Zasadniczo, jeśli zadeklarujesz coś, co wymaga usunięcia, jesteś odpowiedzialny za jego usunięcie. I w domniemaniu do tej zasady, niczego, czego sam nie zadeklarujesz, nie powinieneś pozbywać się. Więc obausing
są konieczne.Zmodyfikowałem mój, aby zwracał ciąg zamiast używać zmiennej ref, jak poniżej.
Jego użycie byłoby takie:
źródło
Exception
rzucasz tam nowy , rozszerzyłeś StackTrace o metodę „Serialize <>”.Poniższą funkcję można skopiować do dowolnego obiektu, aby dodać funkcję zapisu XML przy użyciu przestrzeni nazw System.Xml.
Aby utworzyć obiekt z zapisanego pliku, dodaj następującą funkcję i zastąp [ObjectType] typem obiektu, który chcesz utworzyć.
źródło
writer.Flush()
jest zbędny wusing
bloku -writer
jestDispose()
metoda będzie opróżnić go dla Ciebie.Klasa rozszerzenia:
Stosowanie:
Wystarczy odwołać się do nazw trzymając swoją metodę rozszerzenia w pliku chcesz go używać i będzie działać (w moim przykładzie będzie to:
using MyProj.Extensions;
)Zauważ, że jeśli chcesz, aby metoda rozszerzenia była specyficzna tylko dla określonej klasy (np.,
Foo
), Możesz zastąpićT
argument w metodzie rozszerzenia, np.public static string Serialize(this Foo value){...}
źródło
Możesz użyć funkcji jak poniżej, aby uzyskać serializowany kod XML z dowolnego obiektu.
Możesz to nazwać od klienta.
źródło
Aby serializować obiekt, wykonaj:
Pamiętaj również, że aby XmlSerializer działał, potrzebujesz konstruktora bez parametrów.
źródło
Zacznę od kopii odpowiedzi Bena Gripki:
Użyłem tego kodu wcześniej. Rzeczywistość pokazała jednak, że to rozwiązanie jest nieco problematyczne. Zwykle większość programistów po prostu serializuje ustawienia zapisywania i deserializuje ustawienia przy ładowaniu. To optymistyczny scenariusz. Gdy serializacja się nie powiodła, z jakiegoś powodu plik jest częściowo zapisywany, plik XML nie jest kompletny i jest nieprawidłowy. W rezultacie deserializacja XML nie działa, a aplikacja może ulec awarii podczas uruchamiania. Jeśli plik nie jest duży, sugeruję najpierw serializować obiekt,
MemoryStream
a następnie zapisać strumień do pliku. Ten przypadek jest szczególnie ważny, jeśli występuje skomplikowana niestandardowa serializacja. Nigdy nie możesz przetestować wszystkich przypadków.Scenariusz deserializacji w świecie rzeczywistym powinien się liczyć z uszkodzonym plikiem serializacji, zdarza się to kiedyś. Funkcja ładowania zapewniona przez Ben Gripka jest w porządku.
I może być zawarty w scenariuszu odzyskiwania. Nadaje się do plików ustawień lub innych plików, które można usunąć w razie problemów.
źródło
Wszystkie wyżej wymienione odpowiedzi są poprawne. To jest po prostu najprostsza wersja:
źródło
To jest trochę bardziej skomplikowane niż dzwonienie na numer
ToString
metody klasy, ale niewiele.Oto prosta funkcja rozwijania, której można użyć do serializacji dowolnego typu obiektu. Zwraca ciąg zawierający serializowaną zawartość XML:
źródło
Oto dobry samouczek, jak to zrobić
W tym celu powinieneś w zasadzie użyć
System.Xml.Serialization.XmlSerializer
klasy.źródło
Możesz utworzyć i zapisać wynik jako plik xml w wybranej lokalizacji.
źródło
mój kod pracy. Zwraca utf8 xml włącz pustą przestrzeń nazw.
Przykład zwraca odpowiedź Adres URL płatności AiSo Yandex:
źródło
Mam prosty sposób na serializację obiektu do XML za pomocą C #, działa świetnie i jest bardzo wielokrotnego użytku. Wiem, że to starszy wątek, ale chciałem to opublikować, ponieważ ktoś może uznać to za pomocne.
Oto jak nazywam metodę:
Oto klasa, która działa:
Uwaga: Ponieważ są to metody rozszerzeń, muszą należeć do klasy statycznej.
źródło
W oparciu o powyższe rozwiązania nadchodzi klasa rozszerzenia, której można użyć do serializacji i deserializacji dowolnego obiektu. Wszelkie inne atrybucje XML zależą od Ciebie.
Po prostu użyj tego w ten sposób:
źródło
Lub możesz dodać tę metodę do swojego obiektu:
źródło
Oto podstawowy kod, który pomoże serializować obiekty C # do xml:
źródło
Musisz użyć następujących klas:
źródło