Как упорядочить объект и его содержимое (также объекты) - PullRequest
0 голосов
/ 18 июня 2010

У меня есть вопрос, на который я подозреваю, что ответ немного сложен.На данный момент я программирую DLL (библиотека классов) на C #.Эта DLL использует стороннюю библиотеку и, следовательно, имеет дело со сторонними объектами, исходный код которых у меня отсутствует.Теперь я планирую создать еще одну DLL, которая будет использоваться в моем приложении на более позднем стадионе.Эта вторая DLL должна использовать сторонние объекты (с соответствующими состояниями объектов), созданные первой DLL.

К счастью, сторонние объекты расширяют класс MarshalByRefObject.Я могу маршалировать объекты используя System.Runtime.Remoting.Marshal(...).Затем я сериализую объекты, используя BinaryFormatter, и сохраняю объекты как массив byte[].Все хорошо.Я могу десериализовать и разархивировать противоположным образом и в итоге получить исходные объекты сторонних производителей ... так что они появляются ...

Тем не менее, при вызове методов для десериализованных объектов сторонних производителей я получаю внутренние исключения объектов,Обычно эти методы возвращают другие сторонние объекты, но (очевидно - я полагаю) теперь эти объекты отсутствуют, потому что они не были сериализованы.

Теперь мой глобальный вопрос: как мне выполнить сортировку / сериализацию всех объектовкакие объекты сторонних объектов ссылаются ... и каскадно спускаются по «дереву ссылок» для получения полного и завершенного сериализованного объекта?Сейчас я предпочитаю провести предварительную обработку: получить все объекты, создать собственный объект и сериализовать его.Но я надеюсь, что есть другой способ ...

1 Ответ

1 голос
/ 18 июня 2010

Мне немного непонятно, зачем вам нужны две сборки C # для работы со сторонней DLL, разве первая созданная вами библиотека классов уже не взаимодействует с вашей сторонней DLL? Вот несколько общих ответов при работе с нативными библиотеками. Было бы полезно, если бы сторонняя библиотека была общедоступной, чтобы увидеть, какие интерфейсы она использует.

  1. Если нативная DLL предоставляет свои функции, вы можете использовать вызовы P / Invoke, и в большинстве случаев маршалинг будет выполнен за вас;
  2. Если нативная DLL предоставляет свои методы в качестве COM-интерфейсов, вы можете создавать COM-оболочки ;
  3. Если вам нужно сделать все вручную, вам может понадобиться использовать LayoutKind и FieldOffsetAttribute или StructLayoutAttribute , эти атрибуты помогут вам сообщить компилятору, как расположение внутренней памяти объекта:
  4. Посмотрите на MarshalAsAttribute и UnmanagedType , это может быть именно то, что вам нужно.
...