Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 26.07.2012
Сообщений: 133
.NET 4.x

Существует ли компактный способ десериализации

27.11.2012, 16:51. Показов 830. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Господа, прокомментируйте, пжст, вот какой момент.

В коде один из пользовательских типов заполняется из xml следующим образом:

C#
1
2
3
4
5
6
7
8
9
10
11
12
            XmlDocument document = new XmlDocument();
            document .LoadXml(incomingXml);
            XPathNavigator navigator = doc.CreateNavigator()
            XPathNavigator routingNav = navigator.SelectSingleNode("looking for that it is necessary", namespace);
            XmlSerializer s = new XmlSerializer(typeof(MyType));
            using (StringReader r = new StringReader(routingNav.OuterXml))
            {
                using (XmlReader reader = XmlReader.Create(r))
                {
                    mytype= (MyType)s.Deserialize(reader);
                }
            }
Все работает, но смущает, что использовать приходится и XPathNavigator, и StringReader, и XmlReader. Найти материалы про десериализацию, скажем, XPathNavigator напрямую не удалось. Есть ли более компактный способ десериализации?
Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.11.2012, 16:51
Ответы с готовыми решениями:

Существует способ перевести из RGBA в RGB
Здравствуйте. Столкнулся с проблемой. Мне нужно работать с прозрачностью. Создаю BufferedImage с настройками TYPE_INT_ARGB. Далее рисую...

Существует ли способ открыть общий доступ к папке?
Доброго всем, уважаемые. Вопрос в теме, существует ли способ открыть общий доступ к папке? Всего то нужно открыть папку для всех...

Существует ли способ объявить Duration в XAML ResourceDictionary?
Создать строку можно и к типу Windows.UI.Xaml.Duration она применится, хоть решарпер и считает это ошибкой. А вот в...

3
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
27.11.2012, 20:36
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    public class Records : IRecords
    {
        public byte RecordCount { get; private set; }
        private SortedSet<Record> _records = new SortedSet<Record>();
        public string RecordsFilePath { get; private set; }
 
        ...
        
        public void Save()
        {
            using (var file = File.Open(RecordsFilePath, FileMode.Create, FileAccess.Write))
                new BinaryFormatter().Serialize(new XorStream(file, 24), _records);
        }
 
        public bool Load()
        {
            if (!File.Exists(RecordsFilePath)) return false;
            using (var file = File.Open(RecordsFilePath, FileMode.Open, FileAccess.Read))
                _records = new BinaryFormatter().Deserialize(new XorStream(file, 24)) as SortedSet<Record>;
            return true;
        }
    }
Офк тут бинарная сериализация ,но смысл имхо ясен
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
27.11.2012, 21:29
я пользуюсь таким, тут не весь класс, а только сериализация
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
public class XmlManager
{
    private string path;
 
    public XmlManager(string path)
    {
        if (string.IsNullOrWhiteSpace(path))
            throw new ArgumentNullException("path");
 
        this.path = path;
    }
 
    public T Load<T>() where T : class
    {
        if (!File.Exists(path))
            throw new FileNotFoundException();
 
        using (var fstream = File.OpenRead(path))
        {
            var serialiser = new XmlSerializer(typeof(T));
                
            serialiser.UnknownAttribute += (o, e) => 
            { 
                Console.WriteLine("Unknown attribute: {0} at line: {1} position: {2}", e.Attr, e.LineNumber, e.LinePosition); 
            };
 
            serialiser.UnknownElement += (o, e) => 
            {
                Console.WriteLine("Unknown Element: {0} at line: {1} position: {2}", e.Element, e.LineNumber, e.LinePosition);
            };
 
            var res = (T)serialiser.Deserialize(fstream);
            return res;
        }
    }
 
    public void Save<T>(object obj) where T : class
    {
        if (obj == null)
            throw new ArgumentNullException("obj");
 
        using (var fstream = File.Open(path, FileMode.Create))
        {
            var serialiser = new XmlSerializer(typeof(T));
            serialiser.Serialize(fstream, obj);
            fstream.Flush();
        }
    }
}
0
1 / 1 / 0
Регистрация: 26.07.2012
Сообщений: 133
28.11.2012, 10:57  [ТС]
в этих примерах десериализация идет из файла. Мне же необходимо десериализовать определенный фрагмент xml, который предварительно находится XPathNavigator'ом. При попытке десериализовать, скажем, StringReader получаем:

There is an error in XML document (0, 0).

хотя StringReader необходимый фрагмент XML содержит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.11.2012, 10:57
Помогаю со студенческими работами здесь

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

Существует ли еще простой способ ввести два числа
через пробел, кроме этого? Scanner i = new Scanner(System.in); while(true) { int a1...

Существует ли способ создать(нарисовать) несколько своих слоёв?
Всем привет! Пытаюсь разобраться в рисовке графики (новичок)! Подскажите, пожалуйста, каким образом можно сделать &quot;наслаивание&quot;...

Существует ли способ создать файл ресурсов без использования brcc32.exe?
Существует ли способ создать файл ресурсов без использования brcc32.exe?

[UWP] Существует ли способ узнать, что работу приложения завершил пользователь?
Если это десктопное приложение, то нажал на крестик в правом верхнем углу окна или нажал Alt+F4. Если планшет, то смахнул.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru