Я работал над проектом 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 или в другом месте и отлично работает без специального типа.
Может быть, есть лучший способ справиться со всем этим, и мне не хватает его. Я не против перетаскивания маршрута словаря для чего-то другого, или я могу переписать любое количество другого кода для выполнения этой работы.
Ошибка 1: попытка сериализации вашей реализации, а не * данных.
Ошибка 2: использование BinaryFormatter
... почти всегда (за исключением, может быть, AppDomain
marshalling)
Мой совет: создайте простую модель (модель DTO), которая просто представляет данные, которые вам нужны, но не с точки зрения вашей конкретной реализации (без OCAdapter.OCCamera
т.д.). Вы можете построить эту модель DTO любым способом, удобным для любой библиотеки сериализации. Я частично отношусь к protobuf-net, но многие другие существуют. Затем перейдите в/из вашей модели DTO и вашей модели реализации.
Преимущества: