Как я могу сделать метод, чтобы принимать только сериализуемые объекты? - PullRequest
0 голосов
/ 21 декабря 2018

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

1 Ответ

0 голосов
/ 21 декабря 2018

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

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

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

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

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

...