Я работаю над приложением Silverlight, которое должно отображать сложную 2-мерную векторную графику. Он загружает заархивированный файл XAML с сервера, анализирует его (XamlRead) и внедряет в корень макета на странице. Это отлично работает для довольно небольших файлов xaml. Проблема в том, что мне нужно заставить его работать с гораздо большим файлом (в нем намного больше контента). Например, один из моих несжатых файлов xaml имеет размер 20 МБ, и метод XamlRead требует много времени для его анализа. Мой вопрос в том, есть ли способ выполнить весь синтаксический анализ на стороне сервера. Лучше всего просто сохранить сериализованный двоичный вывод метода XamlRead как BLOB в базе данных. Однако, когда я пытаюсь сериализовать его, я получаю сообщение, что «объект Canvas не помечен как сериализуемый». Буду очень признателен за любые советы.
Двоичная сериализация объекта XAML Silverlight
Ответы (3)
Silverlight не имеет встроенной двоичной сериализации; однако protobuf-net работает в Silverlight и может помочь восполнить этот пробел. В текущей сборке вы можете действительно сериализовать только те типы, которыми вы управляете (за счет добавления атрибутов), однако я нахожусь в середине большого рефакторинга, чтобы (среди прочего) добавить поддержку сериализации типов без атрибутов.
Я ожидаю, что пройдет еще около двух недель, прежде чем это станет (надеюсь) стабильной сборкой, но тогда вы можете взглянуть на нее.
Обратите внимание, что вам все равно нужно будет оказать ему некоторую помощь (сообщить, что вы хотите сериализовать), но это может быть полезно.
В частности, формат данных («буферы протокола») спроектирован так, чтобы быть как плотным, так и эффективным для обработки, что должно увеличить скорость синтаксического анализа. Подробнее см. здесь (номера взяты из основного .NET, а не Silverlight )
Я обнаружил, что пакет SharpSerializer очень прост в использовании для быстрой двоичной серлизации в Silverlight: http://www.sharpserializer.com/en/index.html. Вам не нужно использовать атрибут Serializable, однако он сериализует только общедоступные члены.
Если синтаксический анализ действительно является проблемой, может помочь использование предварительно скомпилированных XAML, называемых «BAML». Это двоичное представление файла XAML. Поскольку двоичный формат имеет гораздо более дешевый синтаксический анализатор вместо слишком общего XML, это очень помогает. BAML также используется внутри компилятора .NET для создания более компактных файлов.
Для получения дополнительной информации см. Также http://stuff.seans.com/2008/07/13/hello-wpf-world-part-2-why-xaml/