2009-07-27 2 views
22

У меня есть код с использованием XmlSerializer для сериализации/десериализации структуры данных для обеспечения устойчивости. Я читал и слышал в нескольких местах здесь, на StackOverflow, что XmlSerializer является один или более из:Замена для XML-сериализации

  • Bad
  • Плохо поддерживается/реализована
  • Возможно, не будет поддерживаться в будущем

Мой вопрос в два раза; является ли любое из указанных выше истинным, и если да, то какие существуют альтернативы? Для моих целей XML работает очень хорошо, и я хотел бы сохранить такую ​​постоянную, но все остальное можно изменить.

EDIT: Если вы хотите предложить что-то другое для XML, я открыт для него, но он нуждается в удобочитаемости.

ответ

12

XmlSerializer отлично поддерживается, но имеет некоторые сбои;

  • Относительно slow; но обычно это все еще достаточно быстро
  • поддерживает только публичные пользователи; может быть боль
  • требует записи списков - методы доступа просто уродливые

Однако, я ожидаю, что это по-прежнему существует в течение значительного времени; IMO, это BinaryFormatter, у которого есть real проблемы (при использовании для настойчивости).

Я очень предвзятый (так как я автор), но я бы выбрал protobuf-net; двоичный сериализатор с использованием формата проводных протоколов Google; быстрый, портативный между языками/платформами, очень малый выход, толерантность к версии и т. д. (и, конечно же, бесплатно). Ясно, что не xml, хотя - так не читается человеком.

+0

Marc, можно (легко) заменить BinaryFormatter по умолчанию на protobuf-net для использования с удалением .net? – M4N

+0

Я не * требую * XML (хотя было бы хорошо, чтобы он не нарушал существующие установки), но я требую, чтобы человек был читабельным. Спасибо за список минусов. –

+2

Для удаленного доступа вы можете реализовать 'ISerializable' (через protobuf-net) примерно в 4 строках кода для каждого объекта; о лучшем, что я могу получить ... это необходимо только для «корневых» объектов (а не для инкапсулированных объектов). Для человека читабельны ... возможно, JSON.Net? –

1

Если вы можете использовать .Net 3.5 (желательно SP1), я бы посмотрел на DataContractSerializer. Хотя он менее конфигурируется, чем XmlSerializer, он работает быстрее, проще работать (по крайней мере, в моем опыте) и более переносимым (то есть для веб-сервисов). SP1 изменил поведение по умолчанию, чтобы отказаться от него, поэтому вы можете сериализовать любой класс без явного определения атрибутов во всем, что вам нужно для сериализации.

Я бы порекомендовал тщательно прочитать документацию на нем, хотя прежде чем инвестировать в него в качестве изменения. В зависимости от того, как настроена ваша сериализация, она может не сработать для вас.

+0

Другой, чем иметь некоторые классы чисто как классы типа обертки, нет ничего особенного о 'XmlSerializer' вещах я сделал. Никаких переопределений или чего-либо подобного. –

2

jSON намного быстрее, чем XML. Вы можете использовать Json.NET для его чтения. Он имеет встроенную сериализацию.

http://james.newtonking.com/pages/json-net.aspx

+9

Есть ли у вас какие-либо цифры для поддержки этой заявки? –

+1

Я провел некоторое тестирование, я могу подтвердить, что файлы/потоки JSON.Net производятся меньше, но скорость на 10% быстрее при сериализации (когда она не имеет отступов) и примерно на 50% медленнее при десериализации. Это всего лишь один набор тестов, по одному набору данных, конечно. Я также подозреваю, что мои настройки JSON.Net при десериализации вызывают задержку - из-за проблемы с абстрактным типом абстрактного списка я должен был сказать, что он ищет дополнительную информацию о типе для ВСЕХ объектов, что не является идеальным. – Tao

+0

(JSON.Net также намного приятнее - может обрабатывать непубличные типы, подтипы без взлома XmlInclude, рекурсивные ссылки разными способами и многое другое - но я клянусь, что я никоим образом не связан! :)) – Tao

4

Что касается XML Serializer, там "поддерживается", а там "поддерживается".

Возрастающее количество отчетов об ошибках Connect в XML-сериализаторе возвращается с подтверждением ошибок и указывает, что ошибки не будут исправлены.

Я уверен, что если вы столкнулись с критикой безопасности в XML-сериализаторе, это будет исправлено.Однако, я думаю, маловероятно, что другие ошибки, которые не так критичны, когда-либо будут исправлены.

1

Я собираюсь взять альтернативный вариант:
XmlSerializer поддерживается, его поведение известно, и оно работает хорошо. Это не плохо". Он очень общий, хорошо документированный, имеет множество примеров. Производительность, вероятно, очень хороша для того, что вам нужно. Вероятно, он делает то, что вам нужно.

Есть некоторые люди, которые имеют особые потребности, которые не рассматриваются XmlSerializer. Из этих требований мы получаем такие вещи, как protobufs, DataContractSerializer и другие варианты.

Но XmlSerializer по-прежнему очень общий и, вероятно, наиболее широко используемый сериализатор в городе. Это, вероятно, самая безопасная ставка для сериализации контента.


Как поддержать ...
MS может быть замедление на исправление ошибок. Я сравниваю это с WinForms. WinForms больше не является основной инфраструктурой пользовательского интерфейса, которая вытесняется Microsoft. Но он все еще зрелый, хорошо работает, хорошо работает. XmlSerializer - это то же самое.

Что касается поддержки в будущем. У MS есть 5 + 5 политика поддержки - они поддерживают продукт в течение 5 лет после его выпуска, а затем вы можете купить дополнительную поддержку за 5 лет. .NET Framework не поддерживается «вещью» - это ОС Windows, которая поддерживает .NET, которая поддерживается. Windows 7 будет включать .NET 3.5 (я думаю, что версия 3.5?), И поэтому все в .NET 3.5, включая WinForms и XmlSerializer, будет «официально поддерживаться» еще на 5 лет, начиная с октября или всякий раз, когда выпускается Win7. Если это .NET 4.0, то все в 4.0 (включая, по-прежнему, WinForms и XmlSerializer) будет поддерживаться в течение 5 лет. 5-летние часы перезапускаются каждый раз, когда новый продукт поставляется с .NET.

Глядя на VB6 Runtime, он был первоначально отправлен с Visual Studio 6 в 1998 году. Он был включен в Windows с тех пор, включая Windows Server 2008 R2, выпущенный в этом году. Таким образом, время выполнения VB будет поддерживаться, по крайней мере, до 2014 года. Это, по крайней мере, 16 лет основной поддержки.

Вам не о чем беспокоиться официальная поддержка. Это не проект с открытым исходным кодом, о котором вы говорите. Это не предложение, как WSE или SOAP Toolkit.

Это правда, что существуют степени поддержки, а более старые .NET API занижены в приоритетном порядке, поскольку новые и запущенные и продвинутые. Но более старые, по-видимому, более стабильны к тому времени, когда они плато. Вы полностью в безопасности.

+0

@ Чисо: вы что-то знаете о темпах исправлений ошибок? Я делаю. Я видел значительные ошибки закрытыми, говоря: «Это реальная ошибка, потому что это устаревший код, поэтому мы не собираемся его исправлять». –

+0

Нет, я ничего не знаю - ваши прямые наблюдения, вероятно, являются лучшим показателем. Я знаю, что люди, которые разработали XmlSerializer и использовали его для поддержки, теперь перемещаются в разные проекты. Он перешел к новым владельцам. – Cheeso

+0

С 28 июня 2009 года я видел проблемы со связью, связанные с «мы не собираемся исправлять это из-за риска взлома чего-то». Сериализатор XML поддерживается все меньше и меньше. –

Смежные вопросы