Проблемы с предварительной загрузкой объектов в текстовый файл для ускорения загрузки

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

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

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

Я пробовал XMLSerializer, и мне кажется, что ему трудно работать со словарем.

Я пробовал BinaryFormatter и получаю сообщение об ошибке:

Введите «OCAdapter.OCCamera» в сборке «OCAdapter.dll», не помеченной как сериализуемая.

Я пробовал DataContractSerializer и получаю сообщение об ошибке:

Введите «OCAdapter.OCCamera» с именем контракта данных «OCCamera:http://schemas.datacontract.org/2004/07/OCAdapter' не ожидается. Рассмотрите возможность использования DataContractResolver или добавления типов ant, которые не известны статически, в список известных типов, например, с помощью атрибута KnownTypeAttribute или путем добавления в список известных типов, передаваемых в DataContractSerializer.

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

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

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


person TonySchoborg    schedule 10.10.2014    source источник
comment
«войти на сервер» — довольно расплывчатое утверждение. Это HTTP-сервис REST? Можете ли вы дать нам образец ответа от этого «сервера»?   -  person Dour High Arch    schedule 10.10.2014
comment
Это сетевой видеорегистратор, NVR. Он записывает потоки с камер видеонаблюдения. Извините, я не знаю, как лучше ответить на вопрос.   -  person TonySchoborg    schedule 10.10.2014


Ответы (1)


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

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

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

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

  • это сработает
  • изменения в реализации не влияют на данные; это влияет только на код сопоставления
  • вы можете использовать практически любой сериализатор, который вы хотите
  • вы можете разумно верифицировать данные
person Marc Gravell    schedule 10.10.2014
comment
Спасибо за быстрый ответ. Я буду работать над этим сегодня вечером. Мне нужно провести некоторое исследование, ваше решение в данный момент у меня выше головы. - person TonySchoborg; 10.10.2014