带有XmlTypeMapping和XmlRootAttribute参数的XmlSerializer构造函数
我想在C#中预取一个已知的类类型的XmlTypeMapping
,以便在将新的XmlSerializer
实例化为XmlReflectionImporter.ImportTypeMapping
(在类类型上的XmlSerializer
构造期间发生)时加速它们的XML反序列化,这看起来非常耗时发生在每个XmlSerializer
构建中。
另外,我解析的xml内容迫使我使用XmlRootAttribute
参数来设置xml根元素名称进行解析,因为它不总是相同的。 为了实现这一点,我可以使用XmlSerializer(Type, XmlRootAttribute)
构造函数来反序列化我的对象。
不过,我也想从预取XmlTypeMapping
受益,我看不到任何XmlSerializer
构造函数,如: XmlSerializer( XmlTypeMapping, XmlRootAttribute )
或其他关闭的东西。 我怎么能做到这一点?
任何帮助将不胜感激! 谢谢。
内置缓存不用于任何接受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))
{
}
}
请享用!
链接地址: http://www.djcxy.com/p/9345.html上一篇: XmlSerializer constructor with XmlTypeMapping and XmlRootAttribute arguments
下一篇: Determine which bit is set, for a date, using complex bit masks