Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
KeBJIaP
145 / 142 / 32
Регистрация: 21.01.2012
Сообщений: 545
Завершенные тесты: 1
1

Как правильно сериализовать и десериализовать коллекцию объектов разных типов?

27.08.2016, 16:13. Просмотров 535. Ответов 4
Метки нет (Все метки)

имеются классы, допустим
C#
1
2
3
4
5
6
7
8
9
10
11
12
        private abstract class Shape {
            public int X { get; set; }
            public int Y { get; set; }
        }
 
        private class Circle : Shape {
            public int Radius { get; set; }
        }
 
        private class Polygon : Shape {
            public int AngleCount { get; set; }
        }
И коллекция

C#
1
2
3
4
5
6
7
        List<Shape> List = new List<Shape>()
        {
            new Circle() {X=1,Y=1,Radius=2},
            new Circle() {X=1,Y=2,Radius=4},
            new Polygon() {X=0,Y=1,AngleCount= 4},
            new Circle() {X=1,Y=4,Radius=2},
        };
Как лучше организовать сохранение в файл такой коллекции?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.08.2016, 16:13
Ответы с готовыми решениями:

Как сериализовать/десериализовать экземпляры классов в файл
Проблема следующая: Имеется три класcа: class Class1 { // Список полей и...

Можно ли сериализовать в консоли, а десериализовать в ASP.NET
Доброго времени суток, уважаемый форум! Пишу я на C# давно (относительно, я...

Сереализация нескольких объектов разных типов в один файл
Имеются 3 списка разных типов. List &lt;A&gt; obj1, List&lt;B&gt; obj2 , List&lt;C&gt; obj3. ...

Как правильно сереализовать и десериализовать.
помогите, пожалуйста, советом. Я сереализую структуру в одном проекте, а...

Как правильно десериализовать ответ в Json
Как правильно десериализовать ответ в Json (С вложенными классами) используя...

4
Psilon
Master of Orion
Эксперт .NET
6000 / 4850 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
27.08.2016, 17:15 2
KeBJIaP, JSON.Net спешит на помощь
C#
1
2
3
4
5
6
7
8
9
10
var obj1 = new {X = "Boo"};
var obj2 = new {Y = "hehehe"};
var list = new List<object> {obj1, obj2};
 
JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };
string Serialized = JsonConvert.SerializeObject(list, settings);
var deserializedList = JsonConvert.DeserializeObject<List<object>>(Serialized, settings);
 
Console.WriteLine(deserializedList[0]);
Console.WriteLine(deserializedList[1]);
1
KeBJIaP
145 / 142 / 32
Регистрация: 21.01.2012
Сообщений: 545
Завершенные тесты: 1
27.08.2016, 17:40  [ТС] 3
Psilon, Супер, спасибо!
А как лучше делать без сторонних библиотек, средствами фреймворка?
Например, в XmlSerializer. С записью ладно - взял несколько сериалайзеров и в зависимости от типа пишу. Но как потом прочитать то что написалось?
0
Psilon
Master of Orion
Эксперт .NET
6000 / 4850 / 902
Регистрация: 10.07.2011
Сообщений: 14,460
Записей в блоге: 5
Завершенные тесты: 4
27.08.2016, 17:51 4
KeBJIaP, не сказал бы, что JSON.Net это стороннее средство.

JSON быстрее работает, создает более компактные файлы, и при этом читается человеком не в пример проще.

Но если уж так не хочется делать лишних 1.5 клика и качать самый популярный нугет-пакет в мире, то можете обойтись DataContractSerializer'ом.
1
Storm23
Эксперт .NETАвтор FAQ
6232 / 3738 / 1415
Регистрация: 11.01.2015
Сообщений: 4,906
Записей в блоге: 31
27.08.2016, 18:35 5
Цитата Сообщение от KeBJIaP Посмотреть сообщение
Как лучше организовать сохранение в файл такой коллекции?
Цитата Сообщение от KeBJIaP Посмотреть сообщение
как лучше делать без сторонних библиотек, средствами фреймворка?
Обычная, стандартная бинарная сериализация, с gzip сжатием:
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
50
51
52
53
54
55
56
57
58
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace ConsoleApplication212
{
    class Program
    {
        static void Main(string[] args)
        {
            var list = new List<Shape>()
            {
                new Circle() {X=1,Y=1,Radius=2},
                new Circle() {X=1,Y=2,Radius=4},
                new Polygon() {X=0,Y=1,AngleCount= 4},
                new Circle() {X=1,Y=4,Radius=2},
            };
 
            //file name
            var file = "c:\\temp.bin";
 
            //save
            using (var fs = new FileStream(file, FileMode.Create))
            using (var zip = new GZipStream(fs, CompressionMode.Compress))
                new BinaryFormatter().Serialize(zip, list);
 
            //load
            using (var fs = new FileStream(file, FileMode.Open))
            using (var zip = new GZipStream(fs, CompressionMode.Decompress))
                list = (List<Shape>)new BinaryFormatter().Deserialize(zip);
 
            Console.ReadLine();
        }
    }
 
 
 
    [Serializable]
    abstract class Shape
    {
        public int X { get; set; }
        public int Y { get; set; }
    }
 
    [Serializable]
    class Circle : Shape
    {
        public int Radius { get; set; }
    }
 
    [Serializable]
    class Polygon : Shape
    {
        public int AngleCount { get; set; }
    }
}
1
27.08.2016, 18:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2016, 18:35

Как можно создать общий класс для разных типов
как можно создать общий класс для разных типов переменной name (Int32, Double,...

Массив разных типов
Подскажите пожалуйста!Ситуация следующая: Есть масив с числами int arr_id;...

Массив списков разных типов
Добрый день. Подскажите пожалуйста как можно задать массив списков разных...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru