Двоичная сериализация объекта XAML Silverlight

Я работаю над приложением Silverlight, которое должно отображать сложную 2-мерную векторную графику. Он загружает заархивированный файл XAML с сервера, анализирует его (XamlRead) и внедряет в корень макета на странице. Это отлично работает для довольно небольших файлов xaml. Проблема в том, что мне нужно заставить его работать с гораздо большим файлом (в нем намного больше контента). Например, один из моих несжатых файлов xaml имеет размер 20 МБ, и метод XamlRead требует много времени для его анализа. Мой вопрос в том, есть ли способ выполнить весь синтаксический анализ на стороне сервера. Лучше всего просто сохранить сериализованный двоичный вывод метода XamlRead как BLOB в базе данных. Однако, когда я пытаюсь сериализовать его, я получаю сообщение, что «объект Canvas не помечен как сериализуемый». Буду очень признателен за любые советы.


person Community    schedule 06.04.2009    source источник


Ответы (3)


Silverlight не имеет встроенной двоичной сериализации; однако protobuf-net работает в Silverlight и может помочь восполнить этот пробел. В текущей сборке вы можете действительно сериализовать только те типы, которыми вы управляете (за счет добавления атрибутов), однако я нахожусь в середине большого рефакторинга, чтобы (среди прочего) добавить поддержку сериализации типов без атрибутов.

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

Обратите внимание, что вам все равно нужно будет оказать ему некоторую помощь (сообщить, что вы хотите сериализовать), но это может быть полезно.

В частности, формат данных («буферы протокола») спроектирован так, чтобы быть как плотным, так и эффективным для обработки, что должно увеличить скорость синтаксического анализа. Подробнее см. здесь (номера взяты из основного .NET, а не Silverlight )

person Marc Gravell    schedule 06.04.2009

Я обнаружил, что пакет SharpSerializer очень прост в использовании для быстрой двоичной серлизации в Silverlight: http://www.sharpserializer.com/en/index.html. Вам не нужно использовать атрибут Serializable, однако он сериализует только общедоступные члены.

person Slaggg    schedule 03.04.2011
comment
Sharpserializer сериализует только публичные свойства. И вы можете определить правила для исключения определенных свойств (например, Canvas). При разработке вы можете использовать xml-сериализатор Sharpserializer, чтобы увидеть, что сериализуется. после завершения вы переходите к двоичной сериализации, чтобы уменьшить объем памяти. - person k3b; 04.04.2011

Если синтаксический анализ действительно является проблемой, может помочь использование предварительно скомпилированных XAML, называемых «BAML». Это двоичное представление файла XAML. Поскольку двоичный формат имеет гораздо более дешевый синтаксический анализатор вместо слишком общего XML, это очень помогает. BAML также используется внутри компилятора .NET для создания более компактных файлов.

Для получения дополнительной информации см. Также http://stuff.seans.com/2008/07/13/hello-wpf-world-part-2-why-xaml/

person Rutger Nijlunsing    schedule 20.09.2009