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

1

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

У меня есть словарь, который я использую, чтобы ссылаться на соответствующий класс ICamera. Если я изменил "кулачок" с типа 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 или добавьте типы муравьев, не известные статически в список известных типов - например, с помощью атрибута KnownTypeAttribute или путем добавления в список известных типов, переданных DataContractSerializer.

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

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

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

  • 0
    «Войти на сервер» - довольно расплывчатое утверждение. Это HTTP-сервис REST? Можете ли вы дать нам пример ответа от этого «сервера»?
  • 0
    Это сетевой видеорегистратор, NVR. Он записывает потоки с камер безопасности. Извините, я не знаю, как лучше ответить на вопрос.
Теги:
dictionary
datacontractserializer
binaryformatter

1 ответ

0

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню