Я слышал о маршале по ссылке, маршал из кровоточащего и маршала по значению. В чем же разница между этими 3? Я знаю, что они используются при транспортировке данных через приложения/сериализацию, но не намного больше.
Маршал отблеска/ссылка/значение?
Ответ 1
Различные формы маршалинга используются для описания того, как ведут себя объекты, когда они передаются между экземплярами AppDomain
через обычные вызовы функций. AppDomain
часто называют легким весовым процессом и обеспечивает изолированный контейнер для управляемых объектов для запуска. Здесь выполняется быстрое разбиение различных типов
Маршал по ссылке
Все типы, которые выводятся из MarshalByRefObject
, будут маршалироваться по ссылке. Эти экземпляры объектов не перемещаются между экземплярами AppDomain
. Они выделяются в конкретном AppDomain
и не оставляют его.
Когда ссылка на MarshalByRefObject
передается по границе AppDomain
, в целевом AppDomain
создается прокси-сервер. Этот прокси-сервер можно использовать для управления объектом в исходном AppDomain
, но сам объект напрямую не доступен.
Маршал по значению
По существу противоположность MarshalByRefObject
. Когда эти значения передаются через границы AppDomain
, они сериализуются через двоичную сериализацию и десериализуются в целевом экземпляре AppDomain
. Результат - два, мы надеемся, независимых значений. Один в каждом домене.
Маршал By Bleed
Определенные классы типов называются Нейтральными доменами. В частности, string
, Type
и другие элементы отражения. Эти объекты не живут в конкретном AppDomain
, и ссылки на них могут свободно делиться между ними. Они похожи на маршала по ссылке в том, что дубликаты не создаются, но прокси не создаются. Вместо этого прямая ссылка разделяется между AppDomain
экземплярами.
Вы должны взглянуть на запись блога Джо Даффи по теме