Хотя я понимаю, что есть аналогичный вопрос (Как сериализовать объект исключения в C #?), и хотя ответы на этой странице были полезными, они не совсем решали проблему или не отвечали на поставленный вопрос.
Я считаю, что вопрос заключался в том, как сериализовать объект, чтобы он мог быть реконструирован (десериализован) в тот же объект. Я попытался использовать решение, данное davogones и Энтони Бут, но без добавления базового класса System.Exception
на стороне потребителя (как в: SerializationException: Exception
) невозможно использовать эти типы (сами по себе) в качестве фактических объектов исключения, которые могут быть выброшены.
Прежде чем я продолжу, позвольте мне объяснить это последнее утверждение. Я пробовал использовать решение Энтони Бута в веб-службе (служба содержит определение сериализуемого объекта) в попытке заставить всех потребителей использовать одно и то же исключение (мы надеемся создать многоразовый сериализуемый тип исключения вместо его повторного создания).
К сожалению, поскольку ни один из типов не наследуется явно от System.Exception
, вы не можете throw
их, что, очевидно, было бы полезно. Как я уже упоминал выше, кажется, что добавление : Exception
к определению класса типа на стороне потребителя позволяет выбросить объект, но для этого требуется редактировать автоматически сгенерированный код WSDL / веб-службы, который интуитивно кажется плохим / необслуживаемым. потренируйтесь для меня (поправьте меня, если я ошибаюсь).
Мой первый вопрос, опять же, можно ли сериализовать System.Exception
или создать производный тип, который можно сериализовать, и, если это возможно, как бы это сделать? Я должен упомянуть, что я изучил то, что кажется официальным способом воссоздать Exception
объект, но, боюсь, я не очень хорошо его понимаю.
Второй вопрос касается архитектуры самого System.Exception
. Я хотел бы знать, почему тип System.Exception
помечен как [Serializable]
, когда он задокументирован и, по-видимому, предназначен для того, чтобы не допустить его правильной сериализации (по крайней мере, с помощью XML), потому что он Data
объект реализует IDictionary
?
Из MSDN:
В: Почему я не могу сериализовать хэш-таблицы?
A: XmlSerializer не может обрабатывать классы, реализующие интерфейс IDictionary. Отчасти это произошло из-за ограничений расписания, а отчасти из-за того, что хеш-таблица не имеет аналога в системе типов XSD. Единственное решение - реализовать настраиваемую хеш-таблицу, которая не реализует интерфейс IDictionary.
Учитывая, что XML становится (если еще не стал) новым стандартом передачи данных (тем не менее, официально рекомендованным Microsoft), кажется абсурдным глупым не допускать, чтобы единственный тип объекта в .NET, который может быть выброшен, не был сериализуемым в формате XML. .
Я с нетерпением жду некоторых мыслей от всех SO'ов (тем более, что это мой первый пост).
Если у вас есть вопросы или вам нужны разъяснения, не стесняйтесь, дайте мне знать.
Примечание. Я только что нашел это сообщение SO, который, кажется, отвечает на несколько вопросов, но я думаю, что хотел бы по-своему. дайте мне знать, если это слишком близко к дубликату.