Как маршалировать объект и его содержимое (также объекты)

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

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

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

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


person Waldo Spek    schedule 18.06.2010    source источник


Ответы (1)


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

  1. Если собственная DLL предоставляет свои функции, вы можете использовать вызовы P / Invoke, и в большинстве случаев маршалинг будет выполнен за вас;
  2. Если собственная DLL предоставляет свои методы как интерфейсы COM, вы можете создать оболочки COM ;
  3. Если вам нужно делать все вручную, вам может потребоваться LayoutKind и FieldOffsetAttribute или StructLayoutAttribute, эти атрибуты помогают вы сообщаете компилятору, как устроена внутренняя память объекта;
  4. Взгляните на MarshalAsAttribute и UnmanagedType, возможно, это именно то, что вам нужно.
person Abel    schedule 18.06.2010
comment
Ну, мне нужны две сборки, потому что есть два процесса, которые нужно запускать в два разных момента времени. Первая сборка создает объект (сторонний объект). В неопределенный момент времени в будущем другая сборка должна использовать информацию в объекте. Что, на мой взгляд, означает, что объект должен быть сериализован, чтобы иметь возможность хранить его. Спасибо за ответ. Я рассмотрю ваши предложения. - person Waldo Spek; 18.06.2010