Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/27: Рейтинг темы: голосов - 27, средняя оценка - 5.00
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
1

XmlSerializer vs BinaryFormatter

27.04.2011, 00:15. Показов 4916. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В чем разница, кроме типа сохранения? Что быстрее, что лучше и удобнее, что и в каком случае использовать "правильнее"? Сам пользуюсь BinaryFormatter, но часто вижу, что многие для примера сериализации приводят именно Xml.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2011, 00:15
Ответы с готовыми решениями:

BinaryFormatter
Мне нужно сохранять в файл некий набор данных и потом их от туда доставать по запросу (целиком)....

Ошибка XmlSerializer.XmlSerializer() недоступен из-за его уровня защиты
Ошбика XmlSerializer.XmlSerializer() недоступен из-за его уровня защиты, как исправить? нужно...

Ошибка в BinaryFormatter
Добрый день, коллеги! Возникла проблемка... Использую в проекте BinaryFormatter. Над проектом...

Проблемы с сериализацией (BinaryFormatter)
Доброго всем времени суток. Есть проблема с использованием BinaryFormatter. Ниже представлен мой...

21
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
27.04.2011, 02:38 2
Я лично всеми руками и ногами за бинарный. Его недостатком является то, что сериализовав данные на .NET, обратное Вы можете сделать только на нем же. То есть, например, есть приложение, передающее по сети данные. Если передающий сервер написан на .NET'е, то и клиент должен быть написан на .NET.
У XML минусом является огромный избыток данных (бывает в 2-3 раза и более), и на мой взгляд работает медленнее. Но можно транспортировать данные и между многими другими платформани.
Бинарный обычно используют чаще, но только не когда нужно будет передавать данные между разными платформани.
0
44 / 45 / 15
Регистрация: 11.08.2010
Сообщений: 226
27.04.2011, 08:34 3
Цитата Сообщение от body90 Посмотреть сообщение
Я лично всеми руками и ногами за бинарный. Его недостатком является то, что сериализовав данные на .NET, обратное Вы можете сделать только на нем же. То есть, например, есть приложение, передающее по сети данные. Если передающий сервер написан на .NET'е, то и клиент должен быть написан на .NET.
У XML минусом является огромный избыток данных (бывает в 2-3 раза и более), и на мой взгляд работает медленнее. Но можно транспортировать данные и между многими другими платформани.
Бинарный обычно используют чаще, но только не когда нужно будет передавать данные между разными платформани.

Ну все зависит от нужд. Мне к примеру сериализация нужна для быстрого и удобного изменения структуры пакета без пересборки приложения каждый раз. Я выгрузил пакеты в XML и радуюсь. Даже тулзу закрывать не надо
Если же надо выгрузить данные для транспортировки, то тут BinaryFormatter в самый раз
0
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
27.04.2011, 10:57 4
Я раньше тоже уважал бинарный, а потом в один прекрасный день изменил пол символа в коде и обнаружил что сохраненная инфа уже не читается
А XML вообще чудеса творит, можно пол класса переписать и он все равно прочитается из файла, ну и редактирование блокнотом тоже плюс

В случае xml приличная задержка только при первом создании serializer, а вот само чтение и дальнейшее использование вполне быстрое
0
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
27.04.2011, 11:18 5
Есть же еще сериализаторы. Вот сейчас в маршрутке и не вспомню, как называются. Но у меня с ними туговато было и я их еще давно решил не использовать.
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
27.04.2011, 11:35 6
Цитата Сообщение от m0nax Посмотреть сообщение
В случае xml приличная задержка только при первом создании serializer, а вот само чтение и дальнейшее использование вполне быстрое
Потому что генерируется специальная сборка, которая и будет заниматься сериализацией.
0
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
27.04.2011, 19:14  [ТС] 7
Решил таки для сохранения настроек использоваться Xml, ибо настройки класс может меняться, а совместимость с прошлым файлом настроек обязательна )
0
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
27.04.2011, 21:06 8
Сомневаюсь, что если у Вас появятся новые поля в классе, то они магическим способом проинициализируются из старой версии...
0
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
27.04.2011, 21:31  [ТС] 9
body90, очень хорошо работает, только что проверил, добавил поле и десериализовал старый файл, все отлично прошло.
0
44 / 45 / 15
Регистрация: 11.08.2010
Сообщений: 226
27.04.2011, 21:37 10
Тут опять же надо смотреть по типу применения. Если это конфиг программы, то, что часто подвергается изменениям\может быть изменено лучше выносить в XML, т.е использовать сериализацию
Если же надо транспортировать данные(инфа о покупкам за день, кол-во посетителей и т.п) на другой компьютер по средствам диска\флешки\интернета то лучше использовать BinaryFormatter, дабы минимализировать размер файла
0
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
28.04.2011, 01:35 11
Цитата Сообщение от r0fL Посмотреть сообщение
body90, очень хорошо работает, только что проверил, добавил поле и десериализовал старый файл, все отлично прошло.
Вы невнимательно читаете!) Добавленное же поле всё равно никак не проинициаллизируется.
0
Кодило
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
28.04.2011, 02:16  [ТС] 12
body90, а, ну да, но это решаемо, в случае с бинарным сериализатором не получилось бы даже десериализовать)
0
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
28.04.2011, 07:54 13
XmlSerializer vs BinaryFormatter - не путайте грешное с праведным, а то несете всякую чушь...
Я лично всеми руками и ногами за бинарный.
это просто слова - давайте причины, а лучше факты...

ЗЫ. У каждого свое назначение...
0
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
28.04.2011, 08:49 14
Konctantin, и почему же Вы нас не просвятили?

Добавлено через 2 минуты
Цитата Сообщение от r0fL Посмотреть сообщение
body90, а, ну да, но это решаемо, в случае с бинарным сериализатором не получилось бы даже десериализовать)
Я просто для каждой версии оставлял отдельный класс и при ошибке десериализации пробовал открыть через старую версию. А XML использую только если мне нужно будет менять что-то блокнотом.
0
399 / 366 / 54
Регистрация: 23.05.2010
Сообщений: 716
10.06.2011, 21:09 15
Подыму слегка старую тему, т.к. вопрос вроде бы невелик, да и к названию темы в общем-то подходит
Возможно ли BinaryFormatter`ом провести сериализацию массива объектов, например такого типизированного списка? Или это умеет только XML, и бинарный сериализатор в пролёте?
C#
1
List<MyClass> myClasses= new List<MyClass>();
0
6 / 6 / 0
Регистрация: 13.07.2013
Сообщений: 57
15.11.2013, 09:33 16
Etrimus, но ведь XmlSerializer не может такое сериализовать, в MSDN прямо так и сказано:MSDN
0
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
15.11.2013, 11:21 17
Цитата Сообщение от Etrimus Посмотреть сообщение
Подыму слегка старую тему, т.к. вопрос вроде бы невелик, да и к названию темы в общем-то подходит
Возможно ли BinaryFormatter`ом провести сериализацию массива объектов, например такого типизированного списка? Или это умеет только XML, и бинарный сериализатор в пролёте?
C#
1
List<MyClass> myClasses= new List<MyClass>();
Почему бы и нет? Только MyClass нужно пометить как сериализируемый.
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
15.11.2013, 16:31 18
body90, нет, XmlSerializer не умеет сериализовать сам List<T>
однако несложно написать свой класс, который будет проходить по списку, получать xml-код для каждого из объектов списка и из таких кусочков формировать уже готовый файл

Добавлено через 15 минут
что-то типа
C#
1
2
3
4
5
6
7
XmlDocument doc = new XmlDocument();
string type = RegEx.Match(list.GetType().ToString(), "\[\w+\]").Value;
doc.LoadXml("<list type='"+type+"'></list>");
foreach(var v in list)
{   
    doc.DocumentElement.InsertAfter(GetXmlElement(v), doc.DocumentElement.LastChild);    
}
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
15.11.2013, 17:20 19
Цитата Сообщение от r0fL Посмотреть сообщение
В чем разница, кроме типа сохранения?
Я бы сказал в гибкости и возможности самому управлять сериализацией (для XML).

Цитата Сообщение от r0fL Посмотреть сообщение
"правильнее"
Это уже каждый решает для себя сам.

Что касается передачи данных, то кто мешает сделать XML сериализацию, зазиповать и отправить массив байт.
0
464 / 341 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
16.11.2013, 03:09 20
Цитата Сообщение от Learx Посмотреть сообщение
XmlSerializer не умеет сериализовать сам List<T>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MemoryStream ms = new MemoryStream();
            List<int> list = new List<int> { 1, 2, 3 };
            XmlSerializer serializer = new XmlSerializer(typeof(List<int>));
            serializer.Serialize(ms, list);
            serializer.Serialize(Console.OpenStandardOutput(), list);
            Console.ReadKey();
        }
    }
}
Вполне рабочий код.
Или мы сейчас о разном говорим?
0
16.11.2013, 03:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2013, 03:09
Помогаю со студенческими работами здесь

Почему BinaryFormatter требует IXmlSerializable?
Доброго дня форумчанам. Столкнулся с такой вот проблемой при сериализации. Почему бинарный...

Сериализация разнотипных коллекций с помощью BinaryFormatter
Привет всем! Подскажите пожалуйста как сериализовать две раснотипные коллекции в одном файле с...

Потеря данных при десериализции (BinaryFormatter)
Имеются три класса: сезон, раунд, матч. Все состоят в отношении агрегация. В раунде 8 матчей, в...

Почему BinaryFormatter не сериализует мой класс?
Здравствуйте. Проблема в том, что BinaryFormatter не сериализует этот класс (необходим мне для...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru