假设我有一个处理邮件的应用程序。在这种情况下,消息只是实现 IMessage 接口的对象,它只是一个标记。
在这个应用程序中,如果邮件无法处理,那么我想记录它,首先进行审核和故障排除。其次,我可能想用它进行重新处理。
理想情况下,我希望将消息序列化为人类可读的格式。第一个候选者是XML,尽管还有其他像JSON。如果我将消息序列化为XML,我想知道消息对象是否是XML可序列化的。一种方法是反映类型并查看它是否具有无参数构造函数,另一种方法是需要 IXmlSerializable 接口。我对这两种方法都不太满意。还有第三种选择是尝试序列化并捕获异常。这实际上没有用 - 我想以某种方式规定 IMessage (或派生类型)应该是xml-serializable。
反射路径有明显的缺点,如安全性,性能等。 IXmlSerializable 路由将我的消息锁定为一种格式,将来,我可能希望将序列化格式更改为JSON。另一件事是,即使最简单的对象现在也必须实现 ReadXml 和 WriteXml 方法。
是否存在涉及最少工作量的路由,这些路由允许我将任意对象(只要它实现标记接口)序列化为XML但不将未来的消息锁定为XML?
答案 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可能适用于审核,但不适用于后处理。还有一些边缘情况可能会导致问题。
如果这是一个现有的应用程序,那么这些可能不是可行的选择。如果是这种情况,那么可以查看类似Json.NET的内容,尝试尽最大努力序列化。