Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сериализация (циклический граф объектов)

1.9K
18 апреля 2009 года
GreenRiver
451 / / 20.07.2008
Добрый день!

Столкнулся с проблемой сериализация сложного графа с циклическими ссылками: предположим есть форма, на ней два объекта Panel - Panel1 и Panel2, на каждой есть элементы (какие-нибудь SuperLink), которые могут ссылаться друг на друга. Это выдуманный пример, но проблема у меня совершенно аналогичная.

Каким образом можно сериализовать такой сложный объект? Основная сложность естественно как восстановить ссылки SuperLink'ов друг на друга.
Уже всяко разно пробовал, ничего не получается - единственная мысль отказаться от стандартного сериализатора, и написать свой...

Буду очень благодарен, за любые намеки, ссылки и т.д )
5
18 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: GreenRiver
Столкнулся с проблемой сериализация сложного графа с циклическими ссылками

Посмотри алгоритм глубокого копирования объектов.
Для разрешения циклических ссылок используется словарь объектов.

А разве встроенный двоичный сериализатор не справляется с такой задачей?

Код:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Diagnostics;

namespace ConsoleApplication12 {

    [Serializable]
    public class ClassA {
        public ClassB Ref;
    }

    [Serializable]
    public class ClassB {
        public ClassA Ref;
    }

    class Program {
        static void Main(string[] args) {
            ClassA a = new ClassA();
            ClassB b = new ClassB();
            a.Ref = b;
            b.Ref = a;

            using (MemoryStream stream = new MemoryStream()) {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream, a);

                stream.Seek(0, SeekOrigin.Begin);

                ClassA a_copy = (ClassA)formatter.Deserialize(stream);
                ClassB b_copy = a_copy.Ref;

                Trace.Assert(ReferenceEquals(a_copy, b_copy.Ref));
            }
            Console.ReadLine();
        }
    }
}
1.9K
18 апреля 2009 года
GreenRiver
451 / / 20.07.2008
И правда справляется, а я мучал XML сериализатор...
Кстати в сторону словаря для объектов я и двигался :)

Большое спасибо! Реально помог! Два дня уже бьюсь... :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог