1

Я работаю над проектом Windows Form Control для импорта в стороннее клиентское программное обеспечение с использованием их поставляемого SDK. Пользовательский контроль, написанный еще одной компанией, которую я пытаюсь загрузить, должен выходить на сервер перед отображением информации, которая может занять 20-30 секунд. Чтобы ускорить работу, у меня возникла идея предварительно загрузить информацию, необходимую элементу управления, в текстовый файл. Поскольку он не является известным типом, он бросает ошибки при попытке сериализации класса.Проблемы с предварительной загрузкой объектов в текстовый файл для более быстрого времени загрузки

У меня есть словарь, который я использую для ссылки на соответствующий класс ICamera. Если я изменил «кулачок» с типа ICamera на строку, например «cam.GetLiveURL()». Он записывает текстовый файл без проблем. Это код, который я использую для заполнения Словаря.

 foreach (ICamera cam in _adapter.Cameras()) 
     { 
      OCCamera.Add(cam.GetDisplayName(), cam); 
     } 

Я пробовал XMLSerializer, и, похоже, у него есть трудности с использованием Словаря.

Я попытался BinaryFormatter и получаю ошибку:

Type 'OCAdapter.OCCamera' in Assembly 'OCAdapter.dll' in not marked as serializable.

Я попытался DataContractSerializer и получаю ошибку:

Type 'OCAdapter.OCCamera' with data contract name 'OCCamera: http://schemas.datacontract.org/2004/07/OCAdapter ' is not expected. Consider using a DataContractResolver or add ant types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding the to the list of known types passed to DataContractSerializer.

Я пытался играть вокруг с DataContractResolver и не могу показаться, чтобы получить это работать, я этого совсем не понимаю.

Код, который я использую для BinaryFormatter и DataContractSerializer, находится прямо из MSDN или в другом месте и отлично работает без специального типа.

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

+0

«знак на сервер» является довольно расплывчатым заявлением. Является ли это службой HTTP REST? Можете ли вы дать нам образец ответа от этого «сервера»? –

+0

Это сетевой видеомагнитофон, NVR. Он записывает потоки с камер безопасности.Мне жаль, что я не знаю, как лучше ответить на вопрос. – TonySchoborg

ответ

0

Ошибка 1: попытка сериализовать реализацию , а не данные *.

Ошибка 2: использование BinaryFormatter ... только о когда-либо (за исключением, может быть, AppDomain сортировочных)

Мой совет: создать простую модель («DTO» модель), которая просто представляет данные вам нужно, но не с точки зрения вашей конкретной реализации (нет OCAdapter.OCCamera и т. д.). Вы можете построить эту модель DTO в любым способом, удобным для любой библиотеки сериализации, которая вам нравится. Я частично отношусь к protobuf-net, но многие другие существуют. Затем перейдите в/из вашей модели DTO и вашей модели реализации.

Преимущество:

  • он будет работать
  • изменений в реализацию не влияют на данные; это только влияет на коде отображения
  • вы можете использовать только о каком-либо сериализаторе вы хотите
  • вы можете версию данные благоразумно
+0

Благодарим за быстрый ответ. Я буду работать над этим сегодня вечером. Мне нужно провести какое-то исследование, на данный момент ваше решение намного над головой. – TonySchoborg