2011-01-25 1 views
0

Я хочу использовать мощный DataContractSerializer для записи или чтения данных в файл XML.Как эффективно использовать DataContractSerializer с этим вариантом использования?

Но, как моя концепция, DataContractSerializer может читать или записывать данные со всей структурой или списком структуры.

Мой пример использования описан ниже .... Я не могу понять, как оптимизировать производительность с помощью этого API.

У меня есть структура под названием «Информация» и имеет List<Information> с неопределенным количеством элементов в этом списке.

Пользователь может обновить или добавить новый элемент в этот список очень часто.

За операцию (добавить или обновить), я должен сериализовать весь элемент в списке в тот же файл XML.

Итак, я буду писать те же данные, даже если они еще не изменены в XML. Это не имеет смысла, но я не могу найти никакого подхода, чтобы избежать этого.

Из-за механизма надгробного камня я должен сохранить всю информацию за 10 секунд.

Я боюсь производительности и, возможно, сделать лаг UI ...

Могу ли я использовать любой обходной путь, чтобы частично обновить или добавить информацию данных в файл XML с помощью DataContractSerializer?

ответ

0

DataContractSerializer может использоваться для сериализации выбранных элементов - вам нужно разработать схему для идентификации измененных данных и способа ее эффективной сериализации. Например, одним из способов может быть

  1. Вы начинаете с сериализации всего списка структур в файл.
  2. Всякий раз, когда какой-либо объект добавляется/обновляется/удаляется из списка, вы создаете объект diff, который будет идентифицировать вид изменения и объект изменился. Затем вы можете сериализовать этот объект в xml и добавить xml в файл.
  3. При чтении файла вам может потребоваться применить аналогичную логику, сначала прочитать список, а затем начать применять diffs один за другим.
  4. Поскольку вы хотите постоянно добавлять к файлу, вы не должны иметь корневой элемент в своем файле. Другими словами, файл с информацией diff не будет действительным XML-документом. Он будет содержать ряд фрагментов xml. Чтобы прочитать это, вы должны заключить эти фрагменты в объявлении xml и корневом элементе.
  5. Вы можете использовать некоторую фоновую задачу, чтобы периодически записывать весь список, чтобы генерировать действительный XML-файл. На этом этапе вы можете отменить свой файл diff. Идея заключается в том, чтобы имитировать транзакционную систему - одну структуру данных, которая имеет сериализованную/сохраненную информацию, а затем другую структуру, содержащую изменения (похожие на журнал транзакций).
0

Если производительность связана с использованием чего-то другого, кроме DataContractSerializer.

Существует хорошее сравнение вариантов на http://blogs.claritycon.com/kevinmarshall/2010/11/03/wp7-serialization-comparison/

Если размер списка является проблемой, вы можете попробовать разбить его на более мелкие списки. Самый подходящий способ сделать это будет зависеть от данных в вашем списке и типичных шаблонов использования/редактирования/добавления.

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

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