У меня есть класс C #, который я унаследовал. Я успешно "построил" объект. Но мне нужно сериализовать объект в XML. Есть ли простой способ сделать это?
Похоже, класс был настроен для сериализации, но я не уверен, как получить представление XML. Мое определение класса выглядит так:
[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
{
...
}
Вот то, что я думал, что мог сделать, но это не работает:
MyObject o = new MyObject();
// Set o properties
string xml = o.ToString();
Как я могу получить представление XML этого объекта?
c#
xml-serialization
user462166
источник
источник
Ответы:
Вы должны использовать XmlSerializer для сериализации XML. Ниже приведен образец фрагмента.
источник
XmlWriter writer = XmlWriter.Create(sww);
XmlTextWriter writer = new XmlTextWriter(sww) { Formatting = Formatting.Indented };
вместоXmlWriter writer = XmlWriter.Create(sww);
XmlWriter
инкапсулирует,StringWriter
вам не нужно избавляться от обоих (первое использование избыточно), верно? Я предполагаю, чтоXmlWriter
позаботится о том, чтобы избавиться от него ...XmlWriter
не инкапсулируетStringWriter
, он использует ваш переданныйStringWriter
и не имеет никаких ожиданий / обязательств по его удалению. Кроме того, этоStringWriter
выходит заXmlWriter
рамки, вы можете все еще хотеть, когдаXmlWriter
вы его утилизируете, это будет плохим поведением,XmlWriter
чтобы избавиться от вашегоStringWriter
. Как правило, если вы объявляете что-то, что требует утилизации, вы несете ответственность за его утилизацию. И подразумеваемое этим правилом, все, что вы не заявляете себе, вы не должны распоряжаться. Так что обаusing
с необходимы.Я изменил мой, чтобы вернуть строку, а не использовать переменную ref, как показано ниже.
Его использование будет выглядеть так:
источник
Exception
добавляете туда новое , вы расширяете StackTrace методом «Serialize <>».Следующая функция может быть скопирована в любой объект для добавления функции сохранения XML с использованием пространства имен System.Xml.
Чтобы создать объект из сохраненного файла, добавьте следующую функцию и замените [ObjectType] типом создаваемого объекта.
источник
writer.Flush()
избыточен вusing
блоке -writer
«sDispose()
метод будет вымывать его для вас.Класс расширения:
Использование:
Просто обратитесь к пространству имен, содержащему ваш метод расширения, в файле, в котором вы хотите его использовать, и он будет работать (в моем примере это будет:
using MyProj.Extensions;
)Обратите внимание, что если вы хотите сделать метод расширения специфичным только для определенного класса (например,
Foo
), вы можете заменитьT
аргумент в методе расширения, например.public static string Serialize(this Foo value){...}
источник
Вы можете использовать функцию как ниже, чтобы получить сериализованный XML из любого объекта.
Вы можете позвонить это от клиента.
источник
Чтобы сериализовать объект, выполните:
Также помните, что для работы XmlSerializer вам нужен конструктор без параметров.
источник
Начну с копии ответа Бена Грипки:
Я использовал этот код ранее. Но реальность показала, что это решение немного проблематично. Обычно большинство программистов просто сериализуют настройки при сохранении и десериализуют настройки при загрузке. Это оптимистичный сценарий. После сбоя сериализации по какой-то причине файл частично записан, файл XML не завершен и является недействительным. В результате десериализация XML не работает, и ваше приложение может аварийно завершить работу при запуске. Если файл не очень большой, я предлагаю сначала сериализовать объект, а
MemoryStream
затем записать поток в файл. Это особенно важно в случае сложной пользовательской сериализации. Вы никогда не сможете проверить все случаи.Сценарий десериализации в реальном мире следует считать поврежденным файлом сериализации, это случается когда-нибудь. Функция загрузки, предоставленная Беном Грипкой, в порядке.
И это может быть связано с некоторым сценарием восстановления. Подходит для файлов настроек или других файлов, которые могут быть удалены в случае проблем.
источник
Все приведенные выше ответы верны. Это просто самая простая версия:
источник
Это немного сложнее, чем вызывать
ToString
метода класса, но не намного.Вот простая функция, которую вы можете использовать для сериализации объектов любого типа. Возвращает строку, содержащую сериализованное содержимое XML:
источник
Вот хороший учебник о том, как это сделать
Вы должны в основном использовать
System.Xml.Serialization.XmlSerializer
класс, чтобы сделать это.источник
Вы можете создать и сохранить результат в виде XML-файла в нужном месте.
источник
мой рабочий код. Возвращает utf8 xml enable пустое пространство имен.
Пример возврата ответа Яндекс.Папи: Ависо URL:
источник
У меня есть простой способ сериализации объекта в XML с использованием C #, он прекрасно работает и его можно многократно использовать. Я знаю, что это старая ветка, но я хотел опубликовать это, потому что кто-то может найти это полезным для них.
Вот как я называю метод:
Вот класс, который делает работу:
Примечание. Поскольку это методы расширения, они должны находиться в статическом классе.
источник
Основываясь на вышеупомянутых решениях, здесь представлен класс расширения, который вы можете использовать для сериализации и десериализации любого объекта. Любые другие атрибуты XML зависят от вас.
Просто используйте это так:
источник
Или вы можете добавить этот метод к вашему объекту:
источник
Вот основной код, который поможет сериализовать объекты C # в xml:
источник
Вам нужно использовать следующие классы:
источник