带有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