c# - IXmlSerializable 和 XmlRootAttribute

标签 c# xml serialization

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

请引用以下 C# 代码(由于变量 'rootName' 超出范围而无法编译)。我的意图是让我的类(class) 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());
        }
    }
}

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

最佳答案

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

关于c# - IXmlSerializable 和 XmlRootAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12779940/

相关文章:

c# - catch(Exception e) 没有捕获托管 dll 抛出的异常

c# - Lazy<> 和 Task<> 可以组合起来推迟数据库查找吗?

ruby-on-rails - 如何最好地在 ruby​​onrails 中创建递归目录列表的 xml 映射?

C++ Boost 如何将 C++ 对象序列化到共享内存并在另一个应用程序中重新创建它

c# - 专门制作一组 WPF 扩展器 'expand',即一次只扩展一个

PHP:查找 XML 节点并插入子节点

android - 如何在 Android 上更改打开的 Spinner 的文本背景颜色

C++ std::mt19937 和 rng 状态保存/加载和可移植性

java - 使用一个 POJO 类来处理不同的 xml 响应

c# - C# 对象到 JSON 的模板化序列化