在.NET中序列化对象以进行审计/记录的策略?

时间:2010-06-09 17:31:58

标签: .net xml logging serialization

假设我有一个处理邮件的应用程序。在这种情况下,消息只是实现 IMessage 接口的对象,它只是一个标记。

在这个应用程序中,如果邮件无法处理,那么我想记录它,首先进行审核和故障排除。其次,我可能想用它进行重新处理。

理想情况下,我希望将消息序列化为人类可读的格式。第一个候选者是XML,尽管还有其他像JSON。如果我将消息序列化为XML,我想知道消息对象是否是XML可序列化的。一种方法是反映类型并查看它是否具有无参数构造函数,另一种方法是需要 IXmlSerializable 接口。我对这两种方法都不太满意。还有第三种选择是尝试序列化并捕获异常。这实际上没有用 - 我想以某种方式规定 IMessage (或派生类型)应该是xml-serializable。

反射路径有明显的缺点,如安全性,性能等。 IXmlSerializable 路由将我的消息锁定为一种格式,将来,我可能希望将序列化格式更改为JSON。另一件事是,即使最简单的对象现在也必须实现 ReadXml WriteXml 方法。

是否存在涉及最少工作量的路由,这些路由允许我将任意对象(只要它实现标记接口)序列化为XML但不将未来的消息锁定为XML?

2 个答案:

答案 0 :(得分:1)

您可以实现一个MessageBase,其中所有消息对象都派生自包含无参数构造函数的消息库。然后使用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 :(得分:1)

所以要求是序列化任意对象(只要它 将标记接口实现为人类可读的格式(可能 XML)以最简单的方式。

Is It Serializable?中所述,确定某个对象是否可序列化很难。

我只能想到两种方法来满足要求:

  1. 将Serialize方法添加到IMessage接口并强制类 实现自己的人类可读格式。
  2. 将您的应用程序界面公开为服务 接受人类可读的格式。例如接受a的WCF服务 您可以记录的人类可读消息(XML)。
  3. 选项1可能适用于审核,但不适用于后处理。还有一些边缘情况可能会导致问题。

    如果这是一个现有的应用程序,那么这些可能不是可行的选择。如果是这种情况,那么可以查看类似Json.NET的内容,尝试尽最大努力序列化。