IXmlSerializable和XmlRootAttribute

时间:2012-10-08 10:34:02

标签: c# xml serialization

我对xml序列化有一个奇怪的要求。

请参阅以下C#代码(由于变量'rootName'超出范围而无法编译)。我的目的是让我的班级GeneralData成为'通用'。这意味着可以根据类构造函数的输入参数将此类序列化为具有不同根元素的不同XML字符串。

[XmlRoot(ElementName = rootName)]
public class GeneralData : Dictionary<String, Object>, IXmlSerializable
{
    public string rootName;
    public GeneralData(string rootName)
    {
        this.rootName = rootName;
    }

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        throw new NotImplementedException();
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        throw new NotImplementedException();
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        foreach (var key in Keys)
        {
            var value = base[key];
            writer.WriteElementString(key, value.ToString());
        }
    }
}

任何人都可以帮我完成任务吗?也许以完全不同的方式? 在此先感谢!!

1 个答案:

答案 0 :(得分:4)

IXmlSerializable无法控制根元素。所以不,你不能真的这样做。你可以做的最接近的是使用new XmlSerializer(...)和重载,它允许你在运行时指定根名称(进入构造函数),但是你应该谨慎:XmlSerializer的非平凡构造函数不使用内置的serializer-cache,这意味着:您最终可以按new XmlSerializer(...)创建新的程序集,并且永远不会卸载程序集。如果您没有为序列化程序实例添加自己的缓存层,这可能会导致内存泄漏问题。