2010-06-09 2 views
0

Предположим, у меня есть приложение, которое обрабатывает сообщения. Сообщения - это просто объекты в этом случае, которые реализуют интерфейс IMessage, который является всего лишь маркером.Стратегии для сериализации объекта для целей аудита/ведения журналов в .NET?

В этом приложении, если сообщение не удается обработать, я хочу его зарегистрировать, прежде всего для аудита и устранения неполадок. Во-вторых, я могу использовать его для повторной обработки.

В идеале, я хочу, чтобы сообщение было сериализовано в формате, удобочитаемом человеком. Первым кандидатом является XML, хотя есть и другие, такие как JSON. Если бы я должен был сериализовать сообщения как XML, я хочу знать, является ли объект сообщения XML-сериализуемым. Один из способов - подумать над типом и посмотреть, есть ли у него конструктор без параметров, а другой - потребовать IXmlSerializable. Я не очень доволен одним из этих подходов. Существует третий вариант, который заключается в попытке сериализовать его и перехватывать исключения. Это не очень помогает - я хочу, в некотором роде, указать, что IMessage (или производный тип) должен быть xml-сериализуемым.

Маршрут отражения имеет очевидные недостатки, такие как безопасность, производительность и т.д. IXmlSerializable маршрут блокирует мои сообщения в одном формате, когда в будущем, я, возможно, захотите изменить формат сериализации, чтобы быть в формате JSON. Другое дело, что даже самые простые объекты теперь должны реализовать ReadXml и WriteXml методов.

Есть ли маршрут, который включает в себя наименьший объем работы, который позволяет мне сериализовать произвольный объект (пока он реализует интерфейс маркера) в XML, но не блокировать будущие сообщения в XML?

+0

Трудно видеть, как это может быть реальной проблемой. Если не через дизайн, вы наверняка узнаете, что класс не сериализуется при отладке. –

+1

Необязательный конструктор необходим для Xml Serialization, но этого недостаточно, чтобы гарантировать успешную сериализацию «произвольного объекта». например ваш объект может содержать поля, которые не могут быть сериализованы, такие как IDictionary. –

+0

Точно Тузо - мне нужно что-то большее. Что-то вроде IXmlSerializable, который говорит, что этот объект предназначен для Xml Serialization, но это не заставляет меня реализовать ReadXml/WriteXml. –

ответ

1

Вы можете реализовать MessageBase, чтобы все объекты вашего сообщения были получены из того, что содержит конструктор без параметров. Затем используйте , а не IMessage.

Любопытно, что если вы разрабатываете сообщения и имеете намерение их для всех быть сериализуемыми, зачем вам нужно их проверять?

Вот общее расширение объекта я использую много:

/// <summary>   
/// Converts an object to a serialized xml string  
/// </summary> 
/// <param name="o">The <see cref="object"/> to serialize</param> 
/// <returns></returns> 
public static string ToXml(this object o) 
{ 
    XmlSerializer xmlSerializer = new XmlSerializer(o.GetType()); 

    using (MemoryStream memoryStream = new MemoryStream()) 
    { 
     using (StreamWriter streamWriter = new StreamWriter(memoryStream)) 
     { 
      xmlSerializer.Serialize(streamWriter, o); 
      streamWriter.Flush(); 
      memoryStream.Flush(); 
      memoryStream.Position = 0; 

      using (StreamReader streamReader = new StreamReader(memoryStream)) 
      { 
       return streamReader.ReadToEnd(); 
      } 
     } 
    } 
} 

реализовать его на свой MessageBase и вы золотые. Ничего не блокировать.

+1

Теперь код должен протестировать с MessageBase для сериализации, какой вид поражения Игнорирование в первую очередь. –

+0

Кстати, я использую StringWriter/StringBuilder для сериализации XML. Не уверен, что, если есть, есть различия. –

+0

Ну да. Лично интерфейс без методов побеждает цель для меня. Это не означает, что вы действительно можете сделать * DO * что-то конкретное с объектом, который вы пытаетесь сделать. Представьте, что объект содержит необходимые методы для сериализации и был спроектирован с соответствующими объектами, которые также могут быть сериализованы. –

1

Таким образом, требование состоит в сериализации произвольного объекта (при условии, что он реализует интерфейс маркера) в удобном для пользователя формате (возможно, XML) самым простым способом.

Как указано в Is It Serializable?, определение того, является ли объект сериализуемым, является трудным.

я могу думать только 2 путей для удовлетворения требований:

  1. Добавить метод Serialize к интерфейсным Шеззаде и силовые классам реализовать свой собственный удобочитаемый формат.
  2. Имейте интерфейс приложения в качестве службы, который принимает читаемый человеком формат. например служба WCF, которая принимает сообщение для чтения (XML), которое вы можете зарегистрировать.

Вариант 1 может быть полезен для аудита, но не для переработки. Также есть некоторые краевые случаи, которые могут вызвать проблемы.

Если это уже существующее приложение, то это, вероятно, нежизнеспособные варианты. Если это так, то, возможно, посмотрите на что-то вроде Json.NET, чтобы попытаться выполнить сериализацию на основе лучших усилий.

Смежные вопросы