8 / 8 / 2
Регистрация: 10.12.2013
Сообщений: 148
1

Сереализация, бинарный формат, или лучший способ хранения информация

06.02.2014, 12:13. Показов 4405. Ответов 4
Метки нет (Все метки)

Много читал по поводу бинарных файлов, систем счисления, способов хранения информация и ничего не понял

Допустим есть класс, мне нужно сохранить единственное его свойство "Name", значение свойства "hellow". Если я сохраняю это свойство через сериализацию, то размер файла 187+ байт, если сохраняю в текстовый файл *.txt строку "hellow" размер файла - 14 байт. Я конечно понимаю, что в бинарный файл через сериализацию сохранена еще информация об объекте, но все равно зачем использовать сериализацию если размер файла в 10 раз больше? Для чего нужна сериализация, если все свойства можно хранить в текстовом формате?

Из вики - "десятичное число 123 в текстовом файле будет представлено побайтно (для ASCII, к примеру), посимвольно: 00110001b (31h), 00110010b (32h), 00110011b (33h), а в двоичном файле: если оно беззнаковое, однобайтное, для простоты, 01111011b. b указывает на двоичную систему счисления, h - на шестнадцатиричную. Символы цифр в таблице ASCII начинаются со смещения 30h. Таким образом, в текстовом файле n-значное десятичное число будет занимать n байт, а в двоичном - приблизительно, более, чем в два раза меньше."

Как в C# сохранить не свойство класса, а просто строку(несколько строк string или число int) в бинарный файл? Вообщем я хочу найти способ хранения информации, который занимает самый меньший размер. И какой способ является самым быстрым по загрузке?

Не понял, какая система счистления является основной, в которой хранится вся информация и какую воспринимает процессор. В одних источниках пишут что двоичная, типа - 00110001 , другие пишут что современные компьютеры давно не используют двоичную систему, а используют шестнадцатиричную - 31h, так какую систему счистлений получает процессор? Или он может получить информацию и в двоичном, и в шестнадцатиричном виде, от чего это зависит?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2014, 12:13
Ответы с готовыми решениями:

Какой лучший способ хранения большого объема данных?
Доброй ночи :) Требуется простой совет, каким образом лучше всего хранить большой объем данных? ...

Подскажите лучший способ хранения данных, чтение/запись файлов
Добрый день. Пишу тренажер для обучению слов (англ-рус). Слова хранятся в файле .txt в виде "arrow...

Бинарный формат для хранения 3D моделей на 64000 полигонов
Добрый день! Мне необходим БинарныЙ формат для хранения моделей и последующей их загрузки из...

Логистика класса или лучший способ обработки данных
Добрый день, Товарищи! Я в общем то представляю различные типы массивов и т.д. , но слабо...

4
6242 / 3543 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
06.02.2014, 13:21 2
Цитата Сообщение от AleksyVB Посмотреть сообщение
И какой способ является самым быстрым по загрузке?
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
using CsvHelper;
using CsvHelper.Configuration;
using MsgPack.Serialization;
using Newtonsoft.Json;
using Newtonsoft.Json.Bson;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Xml.Serialization;
 
namespace Ghost
{
    [ProtoBuf.ProtoContract]
    [JsonObject]
    [Serializable]
    [XmlRoot]
    public class Person
    {
        [ProtoBuf.ProtoMember(1)]
        [JsonProperty]
        [XmlElement]
        public string FirstName { get; set; }
 
        [ProtoBuf.ProtoMember(2)]
        [JsonProperty]
        [XmlElement]
        public string LastName { get; set; }
    }
 
    public class PersonMap : CsvClassMap<Person>
    {
        public override void CreateMap()
        {
            Map(x => x.FirstName).Index(0);
            Map(x => x.LastName).Index(1);
        }
    }
 
    class Program
    {
        static Person test;
 
        static Person TestPerson()
        {
            if (test == null)
            {
                test = new Person()
                {
                    LastName = "Васечкин\"",
                    FirstName = "Петя"
                };
            }
            return test;
        }
 
        /// <summary>
        /// Binary
        /// </summary>
        static void DotNetBinarySerialization()
        {
            BinaryFormatter formatter = new BinaryFormatter();
            using (MemoryStream stream = new MemoryStream())
            {
                Stopwatch sw = Stopwatch.StartNew();
                formatter.Serialize(stream, TestPerson());
                sw.Stop();
                long timeSerialization = sw.ElapsedMilliseconds;
                stream.Position = 0;
                sw.Restart();
                formatter.Deserialize(stream);
                sw.Stop();
                long timeDeserialization = sw.ElapsedMilliseconds;
                Console.WriteLine(".NET binary serialization: \t\t\t{0}\t{1}\t{2}", stream.Length, timeSerialization, timeDeserialization);
            }
        }
 
        /// <summary>
        /// Text
        /// </summary>
        static void XmlSerialization()
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Person));
            using (MemoryStream stream = new MemoryStream())
            {
                Stopwatch sw = Stopwatch.StartNew();
                serializer.Serialize(stream, TestPerson());
                sw.Stop();
                long timeSerialization = sw.ElapsedMilliseconds;
                stream.Position = 0;
                sw.Restart();
                serializer.Deserialize(stream);
                sw.Stop();
                long timeDeserialization = sw.ElapsedMilliseconds;
                Console.WriteLine("Xml serialization: \t\t\t\t{0}\t{1}\t{2}", stream.Length, timeSerialization, timeDeserialization);
            }
        }
 
        /// <summary>
        /// Text
        /// </summary>
        static void JsonSerialization()
        {
            Stopwatch sw = Stopwatch.StartNew();
            string json = JsonConvert.SerializeObject(TestPerson());
            sw.Stop();
            long timeSerialization = sw.ElapsedMilliseconds;
            sw.Restart();
            JsonConvert.DeserializeObject<Person>(json);
            sw.Stop();
            long timeDeserialization = sw.ElapsedMilliseconds;
            Console.WriteLine("Json.NET serialization: \t\t\t{0}\t{1}\t{2}", Encoding.UTF8.GetBytes(json).Length,
                timeSerialization,
                timeDeserialization);
        }
 
        /// <summary>
        /// Text
        /// </summary>
        static void CsvSerialization()
        {
            using (StringWriter stringWriter = new StringWriter())
            using (ICsvSerializer csvSerializer = new CsvSerializer(stringWriter))
            using (ICsvWriter csvWriter = new CsvWriter(csvSerializer))
            {
                csvSerializer.Configuration.RegisterClassMap<PersonMap>();
                Stopwatch sw = Stopwatch.StartNew();
                csvWriter.WriteRecord(TestPerson());
                sw.Stop();
                long timeSerialization = sw.ElapsedMilliseconds;
                long timeDeserialization = -1L;
                using (StringReader textReader = new StringReader(stringWriter.GetStringBuilder().ToString())) 
                using (ICsvParser parser = new CsvParser(textReader))
                using (CsvReader csvReader = new CsvReader(parser))
                {
                    csvReader.Configuration.HasHeaderRecord = false;
                    csvReader.Configuration.RegisterClassMap<PersonMap>();
                    sw.Restart();
                    csvReader.GetRecords<Person>().First();
                    sw.Stop();
                    timeDeserialization = sw.ElapsedMilliseconds;
                }
                Console.WriteLine("CsvHelper serialization: \t\t\t{0}\t{1}\t{2}", 
                    Encoding.UTF8.GetBytes(stringWriter.GetStringBuilder().ToString()).Length, 
                    timeSerialization, timeDeserialization);
            }
        }
 
        /// <summary>
        /// Binary
        /// </summary>
        static void MessagePackSerialization()
        {
            using (MemoryStream stream = new MemoryStream())
            {
                Stopwatch sw = Stopwatch.StartNew();
                var serializer = MessagePackSerializer.Create<Person>();
                serializer.Pack(stream, TestPerson());
                sw.Stop();
                long timeSerialization = sw.ElapsedMilliseconds;
                stream.Position = 0;
                sw.Restart();
                serializer.Unpack(stream);
                sw.Stop();
                long timeDeserilization = sw.ElapsedMilliseconds;
                Console.WriteLine("MessagePack serialization: \t\t\t{0}\t{1}\t{2}", stream.Length, 
                    timeSerialization, 
                    timeDeserilization);
            }
        }
 
        /// <summary>
        /// Binary
        /// </summary>
        static void ProtoBufSerialization()
        {
            using (MemoryStream stream = new MemoryStream())
            {
                Stopwatch sw = Stopwatch.StartNew();
                ProtoBuf.Serializer.Serialize<Person>(stream, TestPerson());
                sw.Stop();
                long timeSerialization = sw.ElapsedMilliseconds;
                stream.Position = 0;
                sw.Restart();
                ProtoBuf.Serializer.Deserialize<Person>(stream);
                long timeDeserialization = sw.ElapsedMilliseconds;
                Console.WriteLine("ProtoBuf serialization: \t\t\t{0}\t{1}\t{2}", stream.Length,
                    timeSerialization,
                    timeDeserialization);
            }
        }
 
        /// <summary>
        /// Biinary
        /// </summary>
        static void BsonSerialization()
        {
            using (MemoryStream stream = new MemoryStream())
            using (BsonWriter bsonWriter = new BsonWriter(stream))
            {
                JsonSerializer serializer = new JsonSerializer();
                Stopwatch sw = Stopwatch.StartNew();
                serializer.Serialize(bsonWriter, TestPerson());
                sw.Stop();
                long timeSerialization = sw.ElapsedMilliseconds;
                stream.Position = 0;
                sw.Restart();
                serializer.Deserialize<Person>(new BsonReader(stream));
                sw.Stop();
                long timeDeserialization = sw.ElapsedMilliseconds;
                Console.WriteLine("Json.NET BSON serialization: \t\t\t{0}\t{1}\t{2}", stream.Length,
                    timeSerialization,
                    timeDeserialization);
            }
        }
 
        static void Main(string[] args)
        {
            DotNetBinarySerialization();
            XmlSerialization();
            JsonSerialization();
            CsvSerialization();
            MessagePackSerialization();
            ProtoBufSerialization();
            BsonSerialization();
            Console.ReadLine();
        }
    }
}
Код
.NET binary serialization:                      217     16      0
Xml serialization:                              218     2       2
Json.NET serialization:                         56      164     50
CsvHelper serialization:                        31      26      7
MessagePack serialization:                      28      168     21
ProtoBuf serialization:                         29      70      5
Json.NET BSON serialization:                    61      9       7
2
8 / 8 / 2
Регистрация: 10.12.2013
Сообщений: 148
06.02.2014, 16:52  [ТС] 3
Цитата Сообщение от AleksyVB Посмотреть сообщение
Из вики - "десятичное число 123 в текстовом файле будет представлено побайтно (для ASCII, к примеру), посимвольно: 00110001b (31h), 00110010b (32h), 00110011b (33h), а в двоичном файле: если оно беззнаковое, однобайтное, для простоты, 01111011b. b указывает на двоичную систему счисления, h - на шестнадцатиричную. Символы цифр в таблице ASCII начинаются со смещения 30h. Таким образом, в текстовом файле n-значное десятичное число будет занимать n байт, а в двоичном - приблизительно, более, чем в два раза меньше."

Как в C# сохранить не свойство класса, а просто строку(несколько строк string или число int) в бинарный файл? Вообщем я хочу найти способ хранения информации, который занимает самый меньший размер. И какой способ является самым быстрым по загрузке?
Вроде потихоньку проясняется.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
namespace WindowsFormsApplication1
{
        public partial class Form1 : Form
        {
                string path = "test.dat";
                public Form1()
                {
                        InitializeComponent();
                }
                private void button1_Click(object sender, EventArgs e)
                {
                        FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
                        BinaryWriter bw = new BinaryWriter(fs, Encoding.Default);
                        bw.Write(1234567890);
                        bw.Close();
                        fs.Close();
                }
        }
}
Если сохранить int=1234567890 в бинарный файл, то размер файла будет 4 байта. Если сохранить 1234567890 в текстовый файл, то размер текстового файла 10 байт.

Но со string похоже такое не пройдет, например строка из 10 символов в *.dat сохранятся размером 11 байт, а в текстовом формате сохраняется в *.txt размером 10 байт))

Добавлено через 2 часа 57 минут
И еще вопрос, если бинарный файл хранит не текстовую информацию, а информацию об объектах или еще что-нибудь, то без программы создателя файла его никак нельзя никакими способами будет правильно прочитать, изменить ("вскрыть")? (за исключением методов подбора графических редакторов, если бинарный файл содержит картинку)
0
Кодогенератор
199 / 199 / 51
Регистрация: 15.06.2011
Сообщений: 794
07.02.2014, 10:06 4
Лучший ответ Сообщение было отмечено AleksyVB как решение

Решение

Цитата Сообщение от AleksyVB Посмотреть сообщение
Я конечно понимаю, что в бинарный файл через сериализацию сохранена еще информация об объекте, но все равно зачем использовать сериализацию если размер файла в 10 раз больше?
ты немного не то сравниваешь - ты сравниваешь сохраненный объект и сохраненные данные. сериализованный объект можно десериализовать в исходный вид и получить такой же объект. и выгода бинарной сериализации будет видна если сравнить объем файла полученный в результате сериализации одного и того же объекта в бинарный формат и, например, xml.

сохранять же данные (просто данные) можно в любом удобном формате (в зависимости от типа данных) - можно хранить их просто в текстовом файле, можно в сжатом файле, а можно в закодированном и т.д.
1
5 / 5 / 1
Регистрация: 05.11.2013
Сообщений: 58
07.02.2014, 12:23 5
А строки еще можно хранить в ASCII, и тогда они вообще по байту будут.
А можно еще сделать перечисление (если набор свойств класса ограничен) и договориться, что 00000001 - это свойство Name = "X", 00000010 - свойство Name = "Y" - тогда объем можно уместить вовсе в 1-2 байта.. Правда, все равно файл будет занимать 4Кб (при условии стандартной NTFS разметки)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2014, 12:23

Нужно вывести одну запись из базы. Обязательно нужно ее через цикл или есть более лучший способ?
У меня есть функция, которая все записи прогоняет и возращает массив, стоит ли с помощью нее мне...

Лучший способ перебора
Не знал как назвать тему. В общем проблема в следующем. Есть 20-25 массивов по 10-30 элементами....

Лучший способ апгрейда
Сразу расскажу, для чего мне нужен апгрейд. Мой ПК пока тянет доту на приемлемых настройках в 100...

Лучший способ сохранения настроек
Какой? :) Есть: - настройки окна и видимости контролов - настройки пользователя по таблицам...


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

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

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