Как я могу сделать метод, чтобы принимать только сериализуемые объекты?
Хотя есть интерфейс с именем 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