DataContractSerializer отсутствует в .NET Compact Framework

Похоже, что DataContractSerializer недоступен в .NET Compact Framework. Я нашел это довольно удивительным, поскольку считаю DataContractSerializer Святым Граалем сериализации и одним из наиболее полезных классов, представленных в .NET 3.

Есть ли способ получить такую ​​же функциональность в рамках Compact Framework, то есть возможность легко сохранять и восстанавливать графики реальных объектов с использованием текстового формата?

Я бы предпочел держаться подальше от старых ограниченных сериализаторов .NET, таких как XmlSerializer и BinarySerializer.

Я думаю, что, возможно, доступна специальная реализация DataContractSerializer, или, может быть, можно использовать код из Mono? Кто-нибудь пробовал это сделать?


person Hermit    schedule 07.03.2009    source источник
comment
(Я добавил несколько мыслей к вашим комментариям; этот комментарий просто для того, чтобы он появился в вашем списке ;-p)   -  person Marc Gravell    schedule 09.03.2009


Ответы (3)


Разве это не доступно в CF 3.5? (edit: нет, я проверил - действительно, нет). Я знаю, что XmlSerialzier есть, но да, у него есть некоторые ограничения.

Должен ли он быть текстовым? Включен вариант protobuf-net, который работает на CF2.0, CF3.5. , Silverlight, Mono, .NET 2.0 и т. Д .; и включает в себя все, что вам обычно нужно (включая обратные вызовы и т. д.).

Между прочим, код Mono (от "Olive"), в последний раз, когда я смотрел, не очень полный ...

(править) Еще одним вариантом может быть Json.NET; из здесь, теперь это работает с CF; поскольку это JSON, он основан на тексте и должен делать большую часть того, что вам нужно.

person Marc Gravell    schedule 07.03.2009
comment
Спасибо! Он должен быть основан на тексте, потому что я обнаружил, что это единственный способ провести рефакторинг моего кода и при этом сохранить данные нетронутыми, даже за счет изменения пространства имен, реструктуризации классов и т. Д. Большинство проблем - это просто операция поиска и замены. исправить с текстовыми файлами. - person Hermit; 09.03.2009
comment
Я пробую Json.NET, но до сих пор не смог заставить его десериализоваться должным образом. Кажется, он не сохраняет никакой информации о типе, поэтому я не могу понять, как он будет обрабатывать, скажем, интерфейсы. Может где-то есть вариант, буду искать ... - person Hermit; 09.03.2009
comment
Re namespace / class и т. Д. - обратите внимание, что protobuf-net не имеет никакой информации об имени; У меня есть пользователи, использующие его с обфусцированным IL (то есть такими членами, как AA1.aB), и он отлично работает. Однако он не будет обрабатывать данные на основе интерфейса - только конкретные типы. Хотя, возможно, стоит взглянуть. - person Marc Gravell; 09.03.2009
comment
Спасибо, отметка, protobuf-net может пригодиться для других целей, но для сохранения и восстановления состояния мне нужна поддержка данных на основе интерфейса. Похоже на ту же проблему, с которой я столкнулся с JSon.NET - person Hermit; 09.03.2009

Я не знаю, справедливо ли называть XmlSerializer «ограниченным». Что ты имеешь в виду? Вы использовали это и обнаружили, что это нужно? Что именно вам не удается?

По моему опыту, XmlSerializer на самом деле имеет более широкие возможности, чем DCS. DCS делает меньше, что, вероятно, хорошо. С другой стороны, DCS делает по крайней мере одно, чего не делает XmlSerializer, а именно: он может сериализоваться напрямую в частные переменные-члены и из них.

XmlSerializer работает быстро и достаточно функционально, и вы можете получить от него полезную информацию.

person Cheeso    schedule 09.03.2009
comment
Я пробовал XmlSerializer и обнаружил, что он непригоден для моих нужд. Основные проблемы: 1. он не может обрабатывать интерфейсы или производные классы 2. он вынуждает вас создавать общедоступные свойства чтения / записи для любых данных, даже если они должны быть частными или только для чтения. См. Мой комментарий ниже для ссылок по этим вопросам. - person Hermit; 09.03.2009

Нашел решение :-)

На http://www.codeproject.com/KB/XML/GR_CustomXmlSerializer.aspx.

Как есть, код не работает в Compact Framework, но я сделал несколько тривиальных корректировок, чтобы заставить его работать, лишь с незначительной потерей функциональности. Я также использовал OpenNetCF, чтобы заполнить несколько недостающих фрагментов CF.

person Hermit    schedule 20.03.2009