Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150

Какая сериализация поддерживает циклические\круговые ссылки?

25.06.2021, 15:26. Показов 1677. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть круговой код вроде этого:
C#
1
2
3
4
5
6
7
8
9
10
11
[Serializable]
public class Alpha
{
Beta beta = new Beta();
}
 
[Serializable]
public class Beta
{
Alpha alpha = new Alpha();
}
Сейчас использую бинарную сериализацию для сохранения объектов - это работает хорошо, но сам файл с объектами трудночитаем. Какие варианты помимо бинарного могут сохранять круговые ссылки?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.06.2021, 15:26
Ответы с готовыми решениями:

Какая кодировка поддерживает .html и .txt?
Какая кодировка поддерживает .html и .txt

Циклические ссылки
Добрый вечер! Нужна помощь, а именно не могу убрать циклические ссылки (чтобы ссылка не вела сама на себя) из меню и свежие записи в...

Циклические ссылки
Есть вопрос. Я написал проект. Весьма большой. В некоторых местах при загрузке некоторых данных возникает задержка. Происходит это в тот...

14
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
25.06.2021, 15:43
Цитата Сообщение от Pandamonk Посмотреть сообщение
Есть круговой код вроде этого
Это не то что сериализоваться, это даже работать не будет. Так как при создании экземпляра Alpha, будет создаваться экземпляр Beta, который в свою очередь создает экземпляр Alpha и т.д. То есть вы получите ошибку переполнения стека.

Что касается форматов сериализации, то можно тут почитать.
https://metanit.com/sharp/tutorial/6.1.php
1
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
25.06.2021, 16:05  [ТС]
Тогда более точный пример того, что есть сейчас
C#
1
2
3
4
5
6
7
8
9
10
public class Cell
{
    public string name { get; set; }
    public List<Edge> edgesAround { get; set; } = new List<Edge>();
}
 
public class Edge
{
    public Cell linkedCell { get; set; }
}
Увы, но по данной ссылке нет информации о том, какой вариант поддерживает это, да и гугл толком не может это объяснить
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
25.06.2021, 16:25
Pandamonk, в интернете первая же ссылка на небезызвестный сайт.

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
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
 
[Serializable]
public class Cell
{
    public string name { get; set; }
    public List<Edge> edgesAround { get; set; } = new List<Edge>();
}
 
[Serializable]
public class Edge
{
    public Cell linkedCell { get; set; }
}
 
class Program
{
    static void Main()
    {
        Cell cell = new Cell();
        cell.edgesAround.Add(new Edge());
        Cell cell2 = new Cell();
        cell.edgesAround[0].linkedCell = cell;
 
        var dcss = new DataContractSerializerSettings { PreserveObjectReferences = true };
        var dcs = new DataContractSerializer(typeof(Cell), dcss);
 
        using (FileStream fs = new FileStream("cell.xml", FileMode.OpenOrCreate))
        {
            dcs.WriteObject(fs, cell);
        }
 
        Console.ReadKey();
    }
}
0
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
25.06.2021, 17:51  [ТС]
А есть ли возможность сразу пометить это в самом классе как это делается с бинарным форматом через добавление параметра [Serializable] над классом?
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
25.06.2021, 18:02
Pandamonk, тут посмотрите. У него, как я понял, свои атрибуты.
https://docs.microsoft.com/en-... ew=net-5.0
0
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
25.06.2021, 18:30  [ТС]
По этой ссылке нет информации о циклических ссылках.
Попробовал взять из интернетов это
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Xml;
 
namespace SerializeTest
{
    [DataContract]
    public class Cell
    {
        [DataMember]
        public string name { get; set; }
        [DataMember]
        public List<Edge> edgesAround { get; set; } = new List<Edge>();
    }
 
    [DataContract(IsReference = true)]
    public class Edge
    {
        [DataMember]
        public Cell linkedCell { get; set; }
    }
}
но не сработало, более того, нельзя присвоить [DataMember(IsReference = true)] - в действительности у меня не каждое поле является IsReference
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
25.06.2021, 19:02
Цитата Сообщение от Pandamonk Посмотреть сообщение
более того, нельзя присвоить [DataMember(IsReference = true)]
Что-то я не понял, чего вы хотите добиться. Класс сохраняется либо по значению, либо как ссылка, если это тот же класс. Вот тут еще можете почитать.
https://docs.microsoft.com/ru-... references
0
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
25.06.2021, 19:15  [ТС]
При попытке использовать [DataMember(IsReference = true)] появляется ошибка, что обнаружена циклическая ссылка, хотя вроде как сам атрибут говорит о том, что ведет на ссылку.
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Что-то я не понял, чего вы хотите добиться. Класс сохраняется либо по значению, либо как ссылка, если это тот же класс. Вот тут еще можете почитать.
Ну на самом деле, не знаю, как это точно работает, но предполагаю, что существует вариант не добавлять значение IsReference в сам класс т.к. у меня лишь определенное поле класса является ссылкой на объект другого класса, но если иначе нельзя, то ладно.
Код выше с классом есть, ну а для того, чтобы воссоздать ошибку - нужно просто сериализовать созданный объект
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
using System.Xml.Serialization;
using System;
using System.Windows.Forms;
using System.IO;
 
namespace SerializeTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Click(object sender, EventArgs e)
        {
            Cell cell1 = new Cell(); // объект
 
            Edge edge1 = new Edge(); 
            cell1.edgesAround.Add(edge1); 
            edge1.linkedCell = cell1; // а вот тут создается цикл
         
            using (var file = new FileStream("test.xml", FileMode.OpenOrCreate))
            {
                var xmlFormatter = new XmlSerializer(typeof(Cell));
                xmlFormatter.Serialize(file, cell1); // и тут мы получаем ошибку
            }
        }
    }
}
Итого - код выше + код ниже = ошибка циклической ссылки, которую пытаюсь обойти
Вопрос сверху: чем удобнее всего читать\редактировать формат json? Сейчас пробую другие десериализаторы, но формат json сохраняет ОДНОЙ сторокой. У меня файл 4 мегабайта длиной экватора - как распилить его на строки?
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
25.06.2021, 22:59
Цитата Сообщение от Pandamonk Посмотреть сообщение
[DataMember(IsReference = true)]
Это к классу применяется. DataContract, а не DataMember.

Цитата Сообщение от Pandamonk Посмотреть сообщение
Итого - код выше + код ниже = ошибка циклической ссылки, которую пытаюсь обойти
Так а причем тут XmlSerializer? Речь про DataContractSerializer, пример которого выше приведен.

Цитата Сообщение от Pandamonk Посмотреть сообщение
чем удобнее всего читать\редактировать формат json?
Как вариант, можно тут почитать.
https://metanit.com/sharp/tutorial/6.5.php

Цитата Сообщение от Pandamonk Посмотреть сообщение
У меня файл 4 мегабайта длиной экватора - как распилить его на строки?
Зачем? Просто десереализуйте. Если хотите на несколько строк сериализовать JSON, то опция WriteIndented есть (см. ссылку выше).
0
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
25.06.2021, 23:31  [ТС]
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Так а причем тут XmlSerializer? Речь про DataContractSerializer, пример которого выше приведен.
Всмысле? Пост 7 + пост 9, DataContract\DataMember не относятся к классу XmlSerializer?
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Зачем? Просто десереализуйте. Если хотите на несколько строк сериализовать JSON, то опция WriteIndented есть (см. ссылку выше).
Это не обязательно, но удобное чтение тут пригодилось бы.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
25.06.2021, 23:37
Цитата Сообщение от Pandamonk Посмотреть сообщение
Всмысле?
Пост 4 смотрите. С циклическими ссылками работает DataContractSerializer, а не XmlSerializer.

Цитата Сообщение от Pandamonk Посмотреть сообщение
DataContract\DataMember не относятся к классу XmlSerializer?
Не относятся.

Цитата Сообщение от Pandamonk Посмотреть сообщение
Это не обязательно, но удобное чтение тут пригодилось бы.
Можете Newtonsoft JSON попробовать, там вроде как есть поддержка циклических ссылок.
0
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
26.06.2021, 00:24  [ТС]
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Не относятся.
Так, тогда моя задница улетает на луну т.к. последние пять часов просто пытаюсь сохранить список созданных объектов, некоторые из которых имеют циклические ссылки, и до сих пор терплю неудачу. Вдобавок к этому, недавно понял, что System.Text.Json.Serialization и newtonsoft.json - неотносящиеся друг к другу сериализаторы, и в попытке загуглить одно, я просто находил другое т.к. слова похожие, и тут, оказывается, DataContractSerializer, в описании класса которого постоянно фигурирует *слово* Xml, в действительности не связано с XmlSerializer.
Что ж, в таком случае сейчас пойдет череда базовых вопросов.

Итак, я хочу сохранить список объектов в файл, и гугл подсказывает, что, видимо, сериализация - и есть то нечто, что позволяет сохранить объекты в файл. И видимо, они имеют разные эээ... форматы, что бы это ни значило.

1) какие форматы или, не знаю, имена у сериализаторов есть, чтобы их можно было банально отличить при загугливании?
metanit подсказывает *бинарный, SOAP, xml, JSON*, гугл подсказывает еще Newtonsoft.Json, есть еще какие-то?

2) какие из них поддерживают циклические ссылки, которая представлена в третьем посте?
этот пост подсказывает, что xml не поддерживает, бинарный формат точно поддерживает т.к. пока что с ним работаю, но он не удобен для чтения. Что из оставшихся поддерживает циклические ссылки?

3) бинарный формат - у сохраненного объекта есть возможность удалять\обнулять поля? Допустим, у меня было некое поле name, которое впоследствии было удалено. Всегда можно создать новый объект-файл без этого поля, но при попытке загрузить старый объект-файл, в котором уже было это поле, я получаю ошибку, - как удалить из бинарного формата поле или при десериализации игнорировать отсутствующие поля, которые были удалены? Гугл пока что говорит, что это просто невозможно. По правде говоря, отсутствие такой возможности - причина, по которой хочу пересесть на любой другой сериализатор, все, что нужно - возможность свободно менять\удалять поля и сохранять объекты с циклическими ссылками, и это то, на чем застрял последние пять часов. Черт, если будет просто программа, которая позволяет читать .bin файл и редактировать его без ошибок - мне этого будет достаточно, но гугл на счет такой программы молчит, а сам файл на 50% состоит из крякозябры.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
26.06.2021, 00:43
1. Не знаю. Если перечисленных будет не хватать, то гугл в помощь.

2. Как минимум DataContractSerializer и Newtonsoft JSON.

Цитата Сообщение от Pandamonk Посмотреть сообщение
Всегда можно создать новый объект-файл без этого поля, но при попытке загрузить старый объект-файл, в котором уже было это поле, я получаю ошибку, - как удалить из бинарного формата поле или при десериализации игнорировать отсутствующие поля, которые были удалены?
Взял пример отсюда, сериализовал файл.
https://metanit.com/sharp/tutorial/6.2.php
Удалил в классе свойство с возрастом и десериализовал. Никаких проблем не возникло. Либо я что-то не понял.
0
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
26.06.2021, 18:52  [ТС]
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Удалил в классе свойство с возрастом и десериализовал. Никаких проблем не возникло. Либо я что-то не понял.
Да, моя ошибка, потерявшаяся в коде
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.06.2021, 18:52
Помогаю со студенческими работами здесь

Циклические ссылки
Всем привет! Хотел бы получить разъяснения по поводу цыклических ссылок у меня на сайте стоит тег FLAC,MP3, дабы разделить музыку по...

Какая версия сервера поддерживает внешние ключи, ... ?
Какая версия сервера поддерживает внешник ключи, хранимые процедуры, триггеры и домены ?

Какая из версий убунту поддерживает автоматическое переключение?
Скачала недавно убунту и заметила что компьютер стал быстро перегреватся. повысить порог температурный по отключению ноута я не решилась....

Какая видеокарта поддерживает видеорежим 1600х900 70-75Гц?
Какая видеокарта потдерживает видеорежим 1600х900 70-75Гц?

Циклические ссылки в меню
Доброго всем времени суток! Люди добрые, нужна помощь в удаление циклических ссылок в шаблоне Twenty Ten: ----нужно сделать...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка 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. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru