Разница между Сериализуемым и MarshalByRefObject
Я очень запутался с атрибутом [Serializable] и :MarshalByRefObject в .NET Remoting. Однако я прочитал много статей об этом. Если я использую атрибут [Serializable], то все методы выполняются полностью в домене вызывающих абонентов, это означает, что разные вызывающие стороны должны иметь копии разных методов в своем собственном домене, и любые изменения, сделанные одним вызывающим абонентом, не должны отражаться на других. Но когда одинаковые То, что я реализую в своей программе, я не получаю желаемого результата.
2 ответа
Serializable
Атрибут используется для подписи объекта, который, когда он запрашивается посредством удаленного взаимодействия, будет сериализован в байтовый массив, передан как байтовый массив из источника в место назначения, а затем другой экземпляр объекта будет перестроен из этого байтового массива, который живет и дышит в месте назначения. окружение (AppDomain или Application). Манипуляции, выполненные на этом объекте, не отражаются на источнике. Чтобы обновить объект, вы должны совершить еще одну поездку к источнику и отправить измененный объект (конечно, в виде нового байтового массива). это похоже на загрузку файла и его изменение, ваши изменения не отражаются на сервере, с которого вы загрузили файл.
var user = server.GetUser("edokan");
user.Alias = "edokan2";
var user2 = server.GetUser("edokan");
//user.Alias == user2.Alias; // is false
С другой стороны MarshalByRefObject
помечает ваш объект, что вместо данных вашего объекта, ссылка на ваш объект передается через удаленное взаимодействие, и каждый вызов метода / каждое манипулирование свойством выполняется на стороне сервера. Это так же, как отправка вашего вопроса в Stackru и чтение ответов, у вас есть только браузер и URL для просмотра / манипулирования вопросом. Все выполняется на серверах Stackru.
Ваша путаница возникает из очень простого момента: MS сделала удаленное взаимодействие ооочень простым, на самом деле каждый думает, что все на стороне клиента.
Добавляя к ответу @edokan, атрибут Serializable в основном помечает тип как предназначенный для сериализации (т. Е. Преобразуемый в поток байтов).
Фреймворки (такие как ORM-преобразователи, oodbs, средства персистентности) могут использовать эту информацию для принятия решений, например, всякий раз, когда состояние объектов должно сохраняться в базах данных, отправляться по сети и т. Д.
Вы можете использовать классы, такие как BinaryFormatter, чтобы взять объект, помеченный атрибутом Serializable, создать из него поток байтов, сохранить его в файле и / или отправить его по сети, а затем восстановить объект из этих потоков снова.