Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 09.04.2018
Сообщений: 11

Сериализация объектов JSON

18.12.2018, 20:16. Показов 5891. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть 4 класса(основные), и есть 4 класса, которые имеют список в котором хранятся объекты одного из основных классов.
Именно эти списки я и пытаюсь сериализовать.
Вот в чем проблема:
При десериализации JSON(в бинарной и хмл всё нормально) кидает ошибку типо непредвиденный символ.
Открыл файл и увидел что неккоректно записались данные, поэтому и ошибка.

Основной класс, с которым ошибка
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
[DataContract]
    public class Area
    {
        [DataMember]
        public string name;
        [DataMember]
        public string type;
        [DataMember]
        public string skill;
        [DataMember]
        public int complexity;
        [DataMember]
        public static int maxValueComplexity;
Другой класс, который хранит информацию об классе выше

C#
1
2
3
4
5
[DataContract]
    public class AreasOperator
    {
        [DataMember]
        public static List<Area> areas = new List<Area>();
Сама сериализация
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
public interface ISerialization
    {
        void Save<T>(List<T> data, string path);
        List<T> Restore<T>(string path);
    }
 
public class JSONSerialization : ISerialization
    {
        public void Save<T>(List<T> data, string path)
        {
            DataContractJsonSerializer jsonFormatter = new DataContractJsonSerializer(typeof(T[]));
            using (FileStream fileStream = new FileStream(path, FileMode.OpenOrCreate))
            {
                jsonFormatter.WriteObject(fileStream, data.ToArray());
            }
        }
 
        public List<T> Restore<T>(string filePath)
        {
            DataContractJsonSerializer jsonFormatter = new DataContractJsonSerializer(typeof(T[]));
            List<T> restoredData = new List<T>();
            using (FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate))
            {
                T[] data = (T[])jsonFormatter.ReadObject(fileStream);
                restoredData.AddRange(data);
            }
            return restoredData;
        }
    }
Реализация
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
private void Serialize(ISerialization serialization, string pathArea, string pathGuide, string pathRoute, string pathTour)
        {
            serialization.Save(AreasOperator.areas, pathArea);
            serialization.Save(GuidesOperator.guides, pathGuide);
            serialization.Save(RoutesOperator.routes, pathRoute);
            serialization.Save(TouresOperator.toures, pathTour);
        }
 
        private void Deserialize(ISerialization serialization, string pathArea, string pathGuide, string pathRoute, string pathTour)
        {
            AreasOperator.areas.Clear();
            GuidesOperator.guides.Clear();
            RoutesOperator.routes.Clear();
            TouresOperator.toures.Clear();
 
            AreasOperator.areas = serialization.Restore<Area>(pathArea);
            GuidesOperator.guides = serialization.Restore<RouteGuide>(pathGuide);
            RoutesOperator.routes = serialization.Restore<Route>(pathRoute);
            TouresOperator.toures = serialization.Restore<Tour>(pathTour);
            
            for (int i = 0; i < AreasOperator.areas.Count; i++)
            {
                areasBox.Items.Add(AreasOperator.areas[i].Name);
            }
            for (int i = 0; i < GuidesOperator.guides.Count; i++)
            {
                guidesBox.Items.Add(GuidesOperator.guides[i].FirstName);
                checkedGuidesBox.Items.Add(GuidesOperator.guides[i].FirstName);
            }
            for (int i = 0; i < RoutesOperator.routes.Count; i++)
            {
                routesBox.Items.Add(RoutesOperator.routes[i].StartPoint + " - " + RoutesOperator.routes[i].EndPoint);
            }
            for (int i = 0; i < TouresOperator.toures.Count; i++)
            {
                touresBox.Items.Add(TouresOperator.toures[i].TourName);
            }
        }
 
private void jSONSave_Click(object sender, EventArgs e)
        {
            
            JSONSerialization json = new JSONSerialization();
            string pathArea = Environment.CurrentDirectory.ToString() + @"\JSONSerialization\Areas.json";
            string pathGuide = Environment.CurrentDirectory.ToString() + @"\JSONSerialization\Guides.json";
            string pathRoute = Environment.CurrentDirectory.ToString() + @"\JSONSerialization\Routes.json";
            string pathTour = Environment.CurrentDirectory.ToString() + @"\JSONSerialization\Toures.json";
            Serialize(json, pathArea, pathGuide, pathRoute, pathTour);
        }
Ниже содержимое файла после сериализации area.json
[{"complexity":1,"name":"лррлрл","s kill":"Новичок","type":"РѕР»СЂР»С ЂР»"}]‹Р°Рї"}]

В других файлах всё нормально...

При чем иногда записывает нормально, и получается без ошибок

Обьясните в чем проблема.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.12.2018, 20:16
Ответы с готовыми решениями:

Сериализация JSON в C#
Доброго времени суток! Начал изучать сериализацию JSON и возникли некоторые недопонимания с моей стороны в плане изучения. Есть следующий...

Сериализация в json
Есть сервер-клиент, работает через асинхронные Udp сокеты, каждые 5 миллисекунд обмениваются информацией в формате json. Проблема в том,...

Сериализация JSON
Здравствуйте! Допустим есть класс: public class Point2D { public double X, Y; private PluginStart Shell; public...

3
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
18.12.2018, 22:17
airborne-, файл имеет кодировку UTF-8.
В текстовом редакторе должна быть выставлена кодировка файла UTF-8.
0
0 / 0 / 0
Регистрация: 09.04.2018
Сообщений: 11
19.12.2018, 10:31  [ТС]
Цитата Сообщение от amr-now Посмотреть сообщение
airborne-, файл имеет кодировку UTF-8.
В текстовом редакторе должна быть выставлена кодировка файла UTF-8.
Так просто в 3 остальных файлах всё нормально читается.
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
19.12.2018, 11:08
Лучший ответ Сообщение было отмечено airborne- как решение

Решение

airborne-, у Вас есть 1 самая главная проблема, почему по итогу ошибка и она не из-за кодировки.
FileMode.OpenOrCreate при существовании файла открывает его и перезаписывает поверх, ничего не удаляя т.е у Вас был там json на 100 символов, а вы хотите туда записать новый на 80 у Вас в итоге выйдет файл где 80 символов от нового файла и + 20 символов от старого, и эти 20 естественно будут не давать делать десериализацию.

если присмотреться к Вашему примеру оно так и есть:
[{"complexity":1,"name":"лррлрл","s kill":"Новичок","type":"РѕР»СЂР»С ЂР»"}]‹Р°Рї"}]

Добавлено через 7 минут
p.s. если Вам нужно перезаписывать всегда поставьте обычный Create без Open, тогда будет всегда пересоздаваться новый файл.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.12.2018, 11:08
Помогаю со студенческими работами здесь

Сериализация в JSON
Добрый день. Прошерстил доки по сериализации JSON, нагугли несколько библиотек, но так и не смог сериализовать свою структуру. ...

Сериализация json в файл
Доброго времени суток, уважаемые форумчане. Возникла проблема. Делаю лаунчер для Minecraft и необходимо реализовать функцию профилей как в...

Сериализация/десериализация JSON
Всем привет. Имеется следующий Json документ: Скрин 1 Больше всего интересует и проводит в ступор...

Сериализация Person в JSON
Есть вот такой класс Person public class Person { public int id; public string fn; public string...

JSON сериализация в Key-Value
Здравствуйте. Есть слудующий json: { &quot;rates_scores_stats&quot;: , &quot;rates_statuses_stats&quot;: }


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru