Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странности с XmlWriter.Create, Разница с конструктором 
V
    Опции темы
diadiavova
Дата 2.2.2015, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Столкнулся со странной проблемой. Создал XmlTextWriter с помощью конструктора для сериализации объекта. Все работало нормально, только текст был не отформатирован. Как работать с этим классом немного подзабыл, но помнил, что есть объект Settings, начал его "мучать, оказалось, что он недоступен для изменения. Потом проблему решил, но до этого, выяснил, что задать собственные настройки можно только создавая экземпляр райтера с помощью метода Create. Все экземпляры, которые я создавал, используя разные перегрузки этого метода, приводили к одному и тому же результату - пустой строке. Здесь хочу заметить, что работал этот объект с тем же самым кодом, в котором экземпляр, созданный с помощью конструктора справился на ура. Что не так с "креэйтом"?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ilya81
Дата 2.2.2015, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.4.2014
Где: ЛО, Всеволожский р-н

Репутация: 1
Всего: 4



А где здесь напрямую вызывается конструктор для XmlTextWriter? Возможно, в других классах просто что-то переопределено.
PM MAIL ICQ Skype   Вверх
diadiavova
Дата 2.2.2015, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(Ilya81 @  2.2.2015,  15:06 Найти цитируемый пост)
А где здесь напрямую вызывается конструктор для XmlTextWriter? Возможно, в других классах просто что-то переопределено. 

Честно говоря, я твоего ответа не понял. Как этот пример объясняет, почему созданный с помощью конструктора экземпляр работает, а с помощью креэйт - нет? smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ilya81
Дата 2.2.2015, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.4.2014
Где: ЛО, Всеволожский р-н

Репутация: 1
Всего: 4



В смысле, что метод Create создаёт, вероятно, другие классы, не XmlTextWriter, а, например, какой-нибудь XmlUtf8RawTextWriter. А в этом классе, вероятно, что-то иначе. 

P. S. Не помню уже по какому поводу, но мне как-то раньше доводилось смотреть эти исходники (в смысле класса XmlWriter).
PM MAIL ICQ Skype   Вверх
diadiavova
Дата 2.2.2015, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Ilya81, а как это может повлиять на то, что он вообще никакого выхлопа не дает. Ведь как я себе представляю процесс сериализации: сериалайзер получает райтер и вызывает последовательно его методы, попутно передавая ему аргументы. При этом ему по барабану, какой именно подтип ему передали, поскольку он работает с интерфейсом базового класса. Теперь, если экземпляр получен, его методы вызваны, то это должно каким-то образом отобразиться на результате или должно вылететь какое-то исключение в конце концов. К тому же, если я передаю методу креэйт теткстрайтер или стрингбилдер (а я пробовал оба варианта), то мне лично тоже как-то пофиг, какой будет райтер, но текст он просто обязан туда сбросить. Хрен с ним, пусть он будет в другой кодировке или хотя бы выбросит исключение, но он не делает ни того ни другого, а просто возвращает пустую строку. Если бы мой код не работал, с райтером, созданным с помощью конструктора, то я бы на код подумал, но тут хрень какая-то получается.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 2.2.2015, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Для большей наглядности выкладыаю пример.

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  xmlwriterexample.rar 29,84 Kb


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ilya81
Дата 3.2.2015, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.4.2014
Где: ЛО, Всеволожский р-н

Репутация: 1
Всего: 4



Я-то думал, речь идёт о XmlSerializer'а, а не DataContractSerializer'е - про последний не очень знаю, но так и так - я в таких случаях предпочитаю подключить исходники framework'а и заглянуть в них отладчиком - часто после этого становится понятно.
PM MAIL ICQ Skype   Вверх
diadiavova
Дата 3.2.2015, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата(Ilya81 @  3.2.2015,  09:15 Найти цитируемый пост)
Я-то думал, речь идёт о XmlSerializer'а, а не DataContractSerializer'е - про последний не очень знаю

А что это меняет? Добавил в код еще и его, тот райтер, который создан с помощью креэйт вывалил исключение, другой - отработал нормально.
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Xml;
using System.Xml.Serialization;
namespace xmlwriterexample
{
 
    [DataContract]
    public class Person
    {
        [DataMember]
       public string Name { get; set; }
        [DataMember]
       public string SecondName { get; set; }
        [DataMember]
       public string Surname { get; set; }

    }
    class Program
    {
        static void Main(string[] args)
        {
            var serializer = new DataContractSerializer(typeof(Person));
            var xserializer = new XmlSerializer(typeof(Person));
            var builder = new StringBuilder();
            using (var writer = new System.IO.StringWriter(builder))
            {
                var xmlwriterNew = new XmlTextWriter(writer);
                var xmlwriterCreate = XmlWriter.Create(writer);
                var person = new Person() { Name = "Иван", SecondName = "Иванович", Surname = "Иванов" };
                builder.AppendLine("Результат работы райтера, созданного конструктором");
                serializer.WriteObject(xmlwriterNew, person);
                builder.AppendLine();
                builder.AppendLine("Результат работы райтера, созданного Create");
                serializer.WriteObject(xmlwriterCreate, person);
                builder.AppendLine("Результат работы райтера, созданного конструктором и XmlSerializer");
                xserializer.Serialize(xmlwriterNew, person);
                builder.AppendLine("Результат работы райтера, созданного Create и XmlSerializer");
                //xserializer.Serialize(xmlwriterCreate, person);
                
                Console.WriteLine(builder.ToString());

            }
            Console.ReadKey();
        }
    }
}

Строка с исключением закомментирована.
Цитата(Ilya81 @  3.2.2015,  09:15 Найти цитируемый пост)
но так и так - я в таких случаях предпочитаю подключить исходники framework'а и заглянуть в них отладчиком - часто после этого становится понятно. 

Видимо придется. Просто проект не на C# пишется и эта функция там недоступна, но теперь есть на чем колдовать.  smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 3.2.2015, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Ну с исключением справился, благодаря добавлению settings, в котором установил ConformanceLevel.Auto. На датаконтрактсериалайзер это действия не возымело. Ну да ладно. smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 3.2.2015, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Отформатировал и малость подкрасил вывод и оказалось, что при использовании хмлсериалайзера с райтером, созданным при помощи креэйт, хмл почему-то продублировался, видимо сериалайзер отработал и за себя за своего датаконтракт-собрата. Короче с этим креэйтом точно что-то не так smile 
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Xml;
using System.Xml.Serialization;
namespace xmlwriterexample
{

    [DataContract]
    public class Person
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string SecondName { get; set; }
        [DataMember]
        public string Surname { get; set; }

    }
    class Program
    {
        static void Main(string[] args)
        {
            var serializer = new DataContractSerializer(typeof(Person));
            var xserializer = new XmlSerializer(typeof(Person));
            var xmlwriterNew = new XmlTextWriter(Console.Out);
            xmlwriterNew.Formatting = Formatting.Indented;
            var settings = new XmlWriterSettings();
            settings.ConformanceLevel = ConformanceLevel.Fragment;
            settings.OmitXmlDeclaration = false;
            settings.Indent = true;
            var xmlwriterCreate = XmlWriter.Create(Console.Out, settings);
            var person = new Person() { Name = "Иван", SecondName = "Иванович", Surname = "Иванов" };
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Результат работы райтера, созданного конструктором");
            Console.ForegroundColor = ConsoleColor.White;
            serializer.WriteObject(xmlwriterNew, person);
            Console.WriteLine();
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Результат работы райтера, созданного Create");
            Console.ForegroundColor = ConsoleColor.White;
            serializer.WriteObject(xmlwriterCreate, person);
            Console.WriteLine();
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Результат работы райтера, созданного конструктором и XmlSerializer");
            Console.ForegroundColor = ConsoleColor.White;
            xserializer.Serialize(xmlwriterNew, person);
            Console.WriteLine();
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Результат работы райтера, созданного Create и XmlSerializer");
            Console.ForegroundColor = ConsoleColor.White;
            xserializer.Serialize(xmlwriterCreate, person);
            Console.ReadKey();
        }

    }
}




--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0810 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.