Предположим, у меня есть приложение, которое обрабатывает сообщения. Сообщения - это просто объекты в этом случае, которые реализуют интерфейс IMessage, который является всего лишь маркером.Стратегии для сериализации объекта для целей аудита/ведения журналов в .NET?
В этом приложении, если сообщение не удается обработать, я хочу его зарегистрировать, прежде всего для аудита и устранения неполадок. Во-вторых, я могу использовать его для повторной обработки.
В идеале, я хочу, чтобы сообщение было сериализовано в формате, удобочитаемом человеком. Первым кандидатом является XML, хотя есть и другие, такие как JSON. Если бы я должен был сериализовать сообщения как XML, я хочу знать, является ли объект сообщения XML-сериализуемым. Один из способов - подумать над типом и посмотреть, есть ли у него конструктор без параметров, а другой - потребовать IXmlSerializable. Я не очень доволен одним из этих подходов. Существует третий вариант, который заключается в попытке сериализовать его и перехватывать исключения. Это не очень помогает - я хочу, в некотором роде, указать, что IMessage (или производный тип) должен быть xml-сериализуемым.
Маршрут отражения имеет очевидные недостатки, такие как безопасность, производительность и т.д. IXmlSerializable маршрут блокирует мои сообщения в одном формате, когда в будущем, я, возможно, захотите изменить формат сериализации, чтобы быть в формате JSON. Другое дело, что даже самые простые объекты теперь должны реализовать ReadXml и WriteXml методов.
Есть ли маршрут, который включает в себя наименьший объем работы, который позволяет мне сериализовать произвольный объект (пока он реализует интерфейс маркера) в XML, но не блокировать будущие сообщения в XML?
Трудно видеть, как это может быть реальной проблемой. Если не через дизайн, вы наверняка узнаете, что класс не сериализуется при отладке. –
Необязательный конструктор необходим для Xml Serialization, но этого недостаточно, чтобы гарантировать успешную сериализацию «произвольного объекта». например ваш объект может содержать поля, которые не могут быть сериализованы, такие как IDictionary. –
Точно Тузо - мне нужно что-то большее. Что-то вроде IXmlSerializable, который говорит, что этот объект предназначен для Xml Serialization, но это не заставляет меня реализовать ReadXml/WriteXml. –