我想在C#中预取一组已知类类型的XmlTypeMapping
,以加快对它们进行XML反序列化,同时将新XmlSerializer
实例化为XmlReflectionImporter.ImportTypeMapping
(在此过程中发生)对类类型进行XmlSerializer
构造是非常耗时的,并且似乎发生在每个XmlSerializer
构造中。
此外,我正在解析的xml内容强制我使用XmlRootAttribute
参数来设置要解析的xml根元素名称,因为它并不总是相同。为此,我可以使用XmlSerializer(Type, XmlRootAttribute)
构造函数来反序列化我的对象。
但是,我还希望从预取XmlTypeMapping
中受益,我看不到任何XmlSerializer
构造函数,如:XmlSerializer( XmlTypeMapping, XmlRootAttribute )
或其他内容。我怎么能做到这一点?
任何帮助将不胜感激!感谢。
答案 0 :(得分:3)
在接受XmlRootAttribute的任何构造函数上都不使用内置缓存。最好的办法是使用接受单个XmlTypeMapping参数的构造函数:
public XmlSerializer(XmlTypeMapping xmlTypeMapping)
将它包装在您自己的接受XmlRootAttribute的构造函数中,并使用XmlReflectionImporter从它构造XmlTypeMapping:
public class CachedRootXmlSerializer : XmlSerializer
{
private static Dictionary<int, XmlTypeMapping> rootMapCache = new Dictionary<int,XmlTypeMapping>();
private static XmlTypeMapping GetXmlTypeMappingFromRoot(Type type, XmlRootAttribute xmlRootAttribute)
{
XmlTypeMapping result = null;
int hash = 17;
unchecked
{
hash = hash * 31 + type.GUID.GetHashCode();
hash = hash * 31 + xmlRootAttribute.GetHashCode();
}
lock (rootMapCache)
{
if (!rootMapCache.ContainsKey(hash))
{
XmlReflectionImporter importer = new XmlReflectionImporter(null, null);
rootMapCache[hash] = importer.ImportTypeMapping(type, xmlRootAttribute, null);
}
result = rootMapCache[hash];
}
return result;
}
CachedRootXmlSerializer(Type type, XmlRootAttribute xmlRootAttribute)
: base(GetXmlTypeMappingFromRoot(type, xmlRootAttribute))
{
}
}
享受!