Поделиться через


Правила сериализации

При разработке новых классов следует рассмотреть возможность использования сериализации, поскольку после компиляции класс уже невозможно сделать сериализуемым. Вот некоторые из вопросов. Следует ли отправлять этот класс между доменами приложений? Будет ли этот класс использоваться для удаленного взаимодействия? Что пользователи будут делать с этим классом: могут ли они наследовать новый класс от моего, который подлежит сериализации? В случае возникновения сомнений отмечайте класс как сериализуемый. Возможно, имеет смысл отмечать все классы как сериализуемые, если не выполняется одно из следующих условий:

  • Класс никогда не выйдет за границы домена приложения. Если сериализация не требуется, и класс должен выйти за пределы домена приложений, наследуйте класс от MarshalByRefObject.

  • В классе хранятся специальные указатели, которые применимы только к текущему экземпляру класса. Например, если класс содержит неуправляемую память или дескрипторы файлов, убедитесь, что эти файлы отмечены атрибутом NonSerializedAttribute, или вообще не сериализуйте класс.

  • Члены данных класса содержат конфиденциальные сведения. В этом случае рекомендуется отмечать класс как сериализуемый, но не отмечать отдельные члены данных, содержащие конфиденциальные сведения, атрибутом NonSerializedAttribute. Другой вариант заключается в реализации интерфейса ISerializable и сериализации только необходимых полей.

Помните о последствиях нарушения безопасности, когда отмечаете класс как сериализуемый. Link Demand или Inheritance Demand для CodeAccessPermission для класса или конструктора класса можно пропускать по умолчанию или при пользовательской сериализации, реализующей соответствующий запрос для того же CodeAccessPermission. (Дополнительные сведения см. в описании перечисления SecurityAction). Если класс содержит Link Demand для разрешения, среда выполнения проверяет только непосредственно вызывающий модуль, чтобы ему гарантированно предоставлялось разрешение. Код библиотеки классов платформы .NET Framework подписывается строгим именем Майкрософт, и ему предоставляется полное доверие. Любой код может использовать код, которому предоставляется полное доверие, чтобы пропустить проверки безопасности во время компоновки. Например, в случае сериализации вредоносный код, у которого нет необходимого разрешения на сериализацию, может вызвать один из полностью доверенных модулей форматирования платформы .NET Framework, например BinaryFormatter, и пропустить проверку запроса ссылки с целью получения разрешения.

См. также

Другие ресурсы

Двоичная сериализация
Remote Objects
XML- и SOAP-сериализация
Security and Serialization