XmlSerializer构造函数,包含XmlTypeMapping和XmlRootAttribute参数

时间:2011-09-29 12:52:39

标签: c# .net xml serialization deserialization

我想在C#中预取一组已知类类型的XmlTypeMapping,以加快对它们进行XML反序列化,同时将新XmlSerializer实例化为XmlReflectionImporter.ImportTypeMapping(在此过程中发生)对类类型进行XmlSerializer构造是非常耗时的,并且似乎发生在每个XmlSerializer构造中。

此外,我正在解析的xml内容强制我使用XmlRootAttribute参数来设置要解析的xml根元素名称,因为它并不总是相同。为此,我可以使用XmlSerializer(Type, XmlRootAttribute)构造函数来反序列化我的对象。

但是,我还希望从预取XmlTypeMapping中受益,我看不到任何XmlSerializer构造函数,如:XmlSerializer( XmlTypeMapping, XmlRootAttribute )或其他内容。我怎么能做到这一点?

任何帮助将不胜感激!感谢。

1 个答案:

答案 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))
    {
    }
}

享受!