Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > сериализация в разных файлах


Автор: Rohoss 7.9.2009, 03:48
Возможно, ли сохранить ссылки объектов друг на друга после сериализации и следующей десериализации объектов в разные файлы.
Вот пример, код написан только для теста. Тут ничего не получается, но может есть варианты?

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Save();
            Load();
        }

        public static void Save()
        {
            SomeClass sc = new SomeClass();

            ClassB cb = null;

            cb = new ClassB();
            cb.sss = "ss1";
            sc.list.Add(cb);

            cb = new ClassB();
            cb.sss = "ss2";
            sc.list.Add(cb);

            cb = new ClassB();
            cb.sss = "ss3";
            sc.list.Add(cb);

            sc.a.b = sc.list;

            Stream s = new FileStream("SomeClass.dat",
            FileMode.Create, FileAccess.Write, FileShare.None);
            BinaryFormatter binFormat = new BinaryFormatter();
            binFormat.Serialize(s, sc);
            s.Close();

            s = new FileStream("ClassA.dat",
            FileMode.Create, FileAccess.Write, FileShare.None);
            binFormat = new BinaryFormatter();
            binFormat.Serialize(s, sc.a);
            s.Close();
        }

        public static void Load()
        {
            Stream fStream = File.OpenRead("SomeClass.dat");
            BinaryFormatter binFormat = new BinaryFormatter();
            SomeClass sc = (SomeClass)binFormat.Deserialize(fStream);
            fStream.Close();

            fStream = File.OpenRead("ClassA.dat");
            binFormat = new BinaryFormatter();
            ClassA ca = (ClassA)binFormat.Deserialize(fStream);
            fStream.Close();

            sc.a = ca;


            if (sc.a.b.Equals(sc.list))
            {
                Console.WriteLine("true");
            }

            Console.ReadLine();
        }
    }

    [Serializable]
    public class SomeClass
    {
        public List<ClassB> list = null;

        [NonSerialized]
        public ClassA a = null;

        public SomeClass()
        {
            list = new List<ClassB>();
            a = new ClassA();
        }
    }

    [Serializable]
    public class ClassA
    {
        public List<ClassB> b = null;
    }

    [Serializable]
    public class ClassB
    {
        public string sss;
    }

}


Автор: Crypton 7.9.2009, 06:51
Нет. Ссылки на объекты как раз происходят в памяти. Можно сказать, что при сериализации обычно хранят данные класса ну и его метаданные.

Автор: Rohoss 7.9.2009, 20:17
Цитата(Crypton @  7.9.2009,  06:51 Найти цитируемый пост)
Нет. Ссылки на объекты как раз происходят в памяти. Можно сказать, что при сериализации обычно хранят данные класса ну и его метаданные

Да это понятно. Я вот думал, может существуют какие – то обходные пути. Но похоже нет, придётся делать свою адресацию  smile 

Автор: Partizan 7.9.2009, 21:25
Сериализуйте BinaryFormatter-ом в MemoryStream, после чего часть байтов можно записать в один файл, а часть - в другой.
Потом собирайте из нескольких файлов данные в один MemoryStream и десериализуйте.

Автор: Rohoss 7.9.2009, 21:41
Partizan, мне же нужно в разные файлы разные классы серилизовать. Как же я потом разделю MemoryStream на разные классы?

Автор: Partizan 7.9.2009, 22:00
а в чём, собственно проблема в вышеуказанном примере тогда?

Автор: Rohoss 7.9.2009, 22:12
Partizan, но это, же упрощенный код.

Добавлено @ 22:15
Нужно держать ссылки на объекты, находящиеся в другом классе (который был в другом файле)

Это нужно для того чтобы быстро обратится к объекту, узнать ссылку на который не так просто. 

Автор: Partizan 7.9.2009, 22:19
проблема в вышеприведённом коде в чём?
в том, что 

Код

            if (sc.a.b.Equals(sc.list))
            {
                Console.WriteLine("true");
            }


тут false. в этом проблема?

Добавлено через 1 минуту
всё, понял

Добавлено через 7 минут и 47 секунд
Сохранить возможно, только придётся reflection-ом бегать по объектам и составлять карту ссылок...в общем стандартными средствами никак smile

Автор: Crypton 8.9.2009, 06:09
Цитата

Сохранить возможно, только придётся reflection-ом бегать по объектам и составлять карту ссылок...в общем стандартными средствами никак


Мне страшно. Слишком рискованное дело.  smile 

Автор: Rohoss 8.9.2009, 17:58
Цитата(Crypton @  8.9.2009,  06:09 Найти цитируемый пост)
Мне страшно. Слишком рискованное дело

В моём случаи можно по другому. Так как нужные мне объекты это параметризированные, многократно вложенные друг в друга коллекции типа List, можно составить карту изначально что – то вроде 1.33.22.567, где 1 – будет корневым объектом в иерархии, а следующие вложениями. И таким образом последний будет нужным мне объектом. Перемещение между ними займёт некоторое время, но не принципиальное…

Автор: Crypton 8.9.2009, 20:31
Цитата(Rohoss @ 8.9.2009,  10:58)
Цитата(Crypton @  8.9.2009,  06:09 Найти цитируемый пост)
Мне страшно. Слишком рискованное дело

В моём случаи можно по другому. Так как нужные мне объекты это параметризированные, многократно вложенные друг в друга коллекции типа List, можно составить карту изначально что – то вроде 1.33.22.567, где 1 – будет корневым объектом в иерархии, а следующие вложениями. И таким образом последний будет нужным мне объектом. Перемещение между ними займёт некоторое время, но не принципиальное…

А, ну тогда особых проблем быть не должно. А обязательно нужно юзать бинарную или XML тут не подойдет?

Автор: Rohoss 8.9.2009, 20:52
Цитата(Crypton @  8.9.2009,  20:31 Найти цитируемый пост)
А, ну тогда особых проблем быть не должно. А обязательно нужно юзать бинарную или XML тут не подойдет?

Не пройдёт, очень большой объем данных. А чем могло бы помочь, если бы я использовал XML или SOAP?

Автор: Crypton 10.9.2009, 17:49
Цитата

А чем могло бы помочь, если бы я использовал XML или SOAP?



Ну XML сериализацию можно пихнуть для например передачи данных к веб сервису по хттпэ. Еще очень помогает её юзать для настроек. Например создаем структуру Configuration где напрямую можно загружать настройки приложения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)