rusqhyazeubebgcahrcsdanlenetfifrglkadeelhuisgaitkkkylvltmknoplptrosrskslessvtrukuz

C# - Сериализация объекта в XML

Больше
3 мес. 2 нед. назад - 3 мес. 2 нед. назад #314 от О.Коровяков
О.Коровяков создал тему: C# - Сериализация объекта в XML
Вы должны использовать XmlSerializer для сериализации XML. Ниже приведен пример фрагмента.
XmlSerializer xsSubmit = new XmlSerializer(typeof(MyObject));
 var subReq = new MyObject();
 var xml = "";
 
 using(var sww = new StringWriter())
 {
     using(XmlWriter writer = XmlWriter.Create(sww))
     {
         xsSubmit.Serialize(writer, subReq);
         xml = sww.ToString(); // Your XML
     }
 }


Кажется, работает отлично без строки XmlWriter writer = XmlWriter.Create(sww);Paul Hunt 27 июнь 2014, в 10:52

Для форматирования сериализованного объекта выполните: XmlTextWriter writer = new XmlTextWriter(sww) { Formatting = Formatting.Indented }; вместо XmlWriter writer = XmlWriter.Create(sww); – Tono Nam 21 июнь 2015, в 15:22

Поскольку XmlWriter инкапсулирует StringWriter вам не нужно утилизировать оба (первое использование избыточно), верно? Я предполагаю, что XmlWriter позаботится о его утилизации ... – talles 10 нояб. 2015, в 20:46

Нет причин иметь как StringWriter и XmlWriter . вам просто нужно использовать StringWriter поскольку XmlSerializer уже выводит данные в StringWriter xml. – Jesper 30 янв. 2017, в 09:04

@talles XmlWriter не инкапсулирует StringWriter , он использует ваш переданный StringWriter и не имеет никаких ожиданий / обязанностей по его StringWriter . Далее StringWriter находится вне XmlWriter сферы «s, Вы можете все еще хотеть, когда XmlWriter расположен, было бы плохое поведение для XmlWriter распоряжаться вашей StringWriter . Как правило, если вы объявляете что-то, что требует утилизации, вы несете ответственность за его утилизацию. И подразумеваемое этим правилом, все, что вы не заявляете о себе, вы не должны распоряжаться. Так что оба using s необходимы. – Arkaine55 24 май 2017, в 15:21

использование System.Xml.Serialization; используя System.IO; использование System.Xml; timothy 16 авг. 2017, в 07:22

@talles Теперь это можно проверить в кодовой базе .NET Core на Github. XmlWriter не располагает базовым StringWriter. – neeohw 25 июль 2018, в 07:00
Последнее редактирование: 3 мес. 2 нед. назад пользователем О.Коровяков.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
3 мес. 2 нед. назад - 3 мес. 2 нед. назад #315 от О.Коровяков
О.Коровяков ответил в теме C# - Сериализация объекта в XML
чтобы вернуть строку, а не использовать переменную ref, как показано ниже.
public static string Serialize<T>(this T value)
{
    if (value == null)
    {
        return string.Empty;
    }
    try
    {
        var xmlserializer = new XmlSerializer(typeof(T));
        var stringWriter = new StringWriter();
        using (var writer = XmlWriter.Create(stringWriter))
        {
            xmlserializer.Serialize(writer, value);
            return stringWriter.ToString();
        }
    }
    catch (Exception ex)
    {
        throw new Exception("An error occurred", ex);
    }
}
Его использование будет таким:
var xmlString = obj.Serialize();


.
очень хорошее решение, мне нравится, как вы реализовали это как метод расширения – Spyros 30 авг. 2013, в 11:38

Здесь я бы предложил одно: уберите блок try ... catch. Это не дает вам никакой пользы, а просто запутывает ошибку, которая выдается. – jammycakes 20 окт. 2014, в 10:50
Последнее редактирование: 3 мес. 2 нед. назад пользователем О.Коровяков.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
3 мес. 2 нед. назад #316 от О.Коровяков
О.Коровяков ответил в теме C# - Сериализация объекта в XML
Следующая функция может быть скопирована на любой объект, чтобы добавить функцию сохранения XML, используя пространство имен System.Xml.
/// <summary>
/// Saves to an xml file
/// </summary>
/// <param name="FileName">File path of the new xml file</param>
public void Save(string FileName)
{
    using (var writer = new System.IO.StreamWriter(FileName))
    {
        var serializer = new XmlSerializer(this.GetType());
        serializer.Serialize(writer, this);
        writer.Flush();
    }
}
Чтобы создать объект из сохраненного файла, добавьте следующую функцию и замените [ObjectType] на тип объекта, который будет создан.
/// <summary>
/// Load an object from an xml file
/// </summary>
/// <param name="FileName">Xml file name</param>
/// <returns>The object created from the xml file</returns>
public static [ObjectType] Load(string FileName)
{
    using (var stream = System.IO.File.OpenRead(FileName))
    {
        var serializer = new XmlSerializer(typeof([ObjectType]));
        return serializer.Deserialize(stream) as [ObjectType];
    }
}


.
writer.Flush() избыточен в using метода Dispose() блочного writer который очистит его для вас. – bavaza 13 март 2015, в 10:38

Мой опыт показал, что это не так. При больших объемах данных оператор using удалит поток до очистки буфера. Я на 100% рекомендую явно вызывать флеш. – Ben Gripka 14 март 2015, в 05:27

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
3 мес. 2 нед. назад #317 от О.Коровяков
О.Коровяков ответил в теме C# - Сериализация объекта в XML
Вы можете использовать функцию, как показано ниже, для получения сериализованного XML из любого объекта.
public static bool Serialize<T>(T value, ref string serializeXml)
{
    if (value == null)
    {
        return false;
    }
    try
    {
        XmlSerializer xmlserializer = new XmlSerializer(typeof(T));
        StringWriter stringWriter = new StringWriter();
        XmlWriter writer = XmlWriter.Create(stringWriter);
 
        xmlserializer.Serialize(writer, value);
 
        serializeXml = stringWriter.ToString();
 
        writer.Close();
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}
Вы можете вызвать это от клиента.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
3 мес. 2 нед. назад #318 от О.Коровяков
О.Коровяков ответил в теме C# - Сериализация объекта в XML
Класс расширения:
using System.IO;
using System.Xml;
using System.Xml.Serialization;
 
namespace MyProj.Extensions
{
    public static class XmlExtension
    {
        public static string Serialize<T>(this T value)
        {
            if (value == null) return string.Empty;
 
            var xmlSerializer = new XmlSerializer(typeof(T));
 
            using (var stringWriter = new StringWriter())
            {
                using (var xmlWriter = XmlWriter.Create(stringWriter,new XmlWriterSettings{Indent = true}))
                {
                    xmlSerializer.Serialize(xmlWriter, value);
                    return stringWriter.ToString();
                }    
            }
        }
    }
}
Использование:
Foo foo = new Foo{MyProperty="I have been serialized"};
string xml = foo.Serialize();

Просто укажите пространство имен, в котором содержится ваш метод расширения, в файле, который вы хотели бы использовать, и он будет работать (в моем примере это будет: using MyProj.Extensions; )

Обратите внимание, что если вы хотите сделать метод расширения конкретным только для определенного класса (например, Foo), вы можете заменить аргумент T в методе расширения, например.
public static string Serialize(this Foo value){...}

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
3 мес. 2 нед. назад #319 от О.Коровяков
О.Коровяков ответил в теме C# - Сериализация объекта в XML
Для сериализации объекта выполните:
using (StreamWriter myWriter = new StreamWriter(path, false))
 {
     XmlSerializer mySerializer = new XmlSerializer(typeof(your_object_type));
     mySerializer.Serialize(myWriter, objectToSerialize);
 }
Также помните, что для работы XmlSerializer вам нужен конструктор без параметров.


.
Это сводило меня с ума. Я не мог понять, почему это всегда было пустым. Потом понял, что у меня нет конструктора без параметров после прочтения вашего ответа. Спасибо. – Andy 23 янв. 2017, в 19:45

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Подпишитесь на наши новости...

Если вам интересны материалы опубликованных на Нашем сайте, Вы можете подписаться на рассылку информационных бюллетеней о новых публикациях ... Просто введите адрес электронной почты на какую Вы хотите получать Новости и нажмите кнопку "Подписаться"

Контакт Инфо

Ok-Wood.
08304 ул.Салютная,c.Гнедын,
Киевская обл, Украина
  • Тел: +39 067 492 41 24
    Tel: +38 095 095 88 60
  • Email: info@ok-wood.com.ua
  • Web: ok-wood.com.ua

Весь процесс строительства описан на страницах сайта, но более подробно о технологии, методах строительства, и всех деталях - Вы можете узнать в книге.