Как я могу сделать метод, чтобы принимать только сериализуемые объекты?

Хотя есть интерфейс с именем ISerializable, кажется, цель настроить детали, когда тип помечен [Serializable] атрибут Если я правильно понял, то [Serializable] Атрибут сам по себе ничего не затрагивает в типе, к которому он прикреплен, но во время выполнения IFormatter определить, помечен ли данный объект [Serializble] атрибут (через отражение? я думаю). Также IFormatter.Serializble() метод принимает любой Object, Означает ли это, что практически каждый объект в.NET может быть сериализован? Если нет, есть ли способ взять только сериализуемые объекты и сделать ошибку во время компиляции, если передан несериализуемый объект?

1 ответ

Решение

Нет, это невозможно сделать для всех типов, которые могут быть сериализуемыми, за исключением, возможно, написания собственного анализатора Roslyn, который применяет точные правила, которые вы хотите, и добавляет предупреждения, которые вы хотите. Это большая работа, и может быть проще добавить модульные тесты / интеграционные тесты, которые охватывают сценарии сериализации, которые вы намереваетесь поддерживать.

Дополнительные примечания:

  • [Serializable] является псевдоатрибутом - он фактически отображается на флаг IL, а не на обычную аннотацию атрибута, и, кроме того, он используется только некоторыми сериализаторами (очень не все)
  • сериализаторы, которые используют ISerializable / IFormatter API, как правило, являются последними сериализаторами, которые вы хотите использовать для большинства сценариев общего назначения - они, как правило, гораздо более хрупки и привязаны к типам, чем другие более щадящие сериализаторы (json, xml, protobuf и т. Д.)

Означает ли это, что практически каждый объект в.NET может быть сериализован?

Нет. Однако разные сериализаторы имеют разные правила, когда вещи могут быть сериализованы, и эти правила часто бывают множественными и разными... т.е. они могут выглядеть как X или как Y или как Z. Таким образом, единственный API, который принимает все 3 является: object

Другие вопросы по тегам