Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1
  • 2
  • 3

ТЕМА:

C# - Сериализация объекта в XML 4 года 7 мес. назад #314

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
Вы должны использовать 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

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

Последнее редактирование: от Олег Коровяков.

C# - Сериализация объекта в XML 4 года 7 мес. назад #315

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
чтобы вернуть строку, а не использовать переменную 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

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

Последнее редактирование: от Олег Коровяков.

C# - Сериализация объекта в XML 4 года 7 мес. назад #316

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
Следующая функция может быть скопирована на любой объект, чтобы добавить функцию сохранения 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

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

C# - Сериализация объекта в XML 4 года 7 мес. назад #317

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
Вы можете использовать функцию, как показано ниже, для получения сериализованного 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;
    }
}
Вы можете вызвать это от клиента.

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

C# - Сериализация объекта в XML 4 года 7 мес. назад #318

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
Класс расширения:
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){...}

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

C# - Сериализация объекта в XML 4 года 7 мес. назад #319

  • Олег Коровяков
  • Олег Коровяков аватар Автор темы
  • Не в сети
  • Автор сайта
  • Автор сайта
  • Сообщений: 280
  • Репутация: 1
  • Спасибо получено: 1
Для сериализации объекта выполните:
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

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

  • Страница:
  • 1
  • 2
  • 3
Модераторы: Дмитрий

О сайте

Строительство индивидуальных домов из лёгкого самана - опыт, советы, методика строительства и подробные инструкции. А также возможность применения альтернативных источников энергии.


Контакты

08340. ул.Салютная 17. с.Гнедын.
Киевская обл. Украина.

+38 067 492 4124.
+38 095 065 8860.

info@okwood.com.ua
www.okwood.com.ua

Местоположения


8PM2+7R Гнедин, Kyiv Oblast