【问题标题】:IXmlSerializable and XmlRootAttributeIXmlSerializable 和 XmlRootAttribute
【发布时间】:2012-10-08 10:34:02
【问题描述】:

我对 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());
        }
    }
}

谁能帮我完成任务?也许以完全不同的方式? 提前致谢!!

【问题讨论】:

    标签: c# xml serialization


    【解决方案1】:

    IXmlSerializable 无法控制根元素。所以不,你真的不能那样做。您可以做的最接近的方法是将new XmlSerializer(...) 与允许您在运行时指定根名称的重载(到构造函数中)一起使用,但您应该小心:XmlSerializer 的非平凡构造函数不使用内置serializer-cache,意思是:你最终可以根据new XmlSerializer(...) 创建一个新的程序集,并且永远不会卸载程序集。如果您不为序列化程序实例添加自己的缓存层,这可能会导致内存泄漏问题。

    【讨论】:

    • 感谢您的建议。我只是将它用作当前的解决方法。下次我会尝试重构代码以避免这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多