序列化,属性为强类型属性

时间:2009-07-30 15:18:53

标签: c# serialization

我有以下xml片段:

<Configuration>
    <Config name="SendToAddresses"></Config>
    <Config name="CCToAddresses"></Config>
    <Config name="BCCAddresses"></Config>
</Configuration>

我想要的是deSerialize到一个强类型的类,包含值对(name | value)的数组中的所有config项。

5 个答案:

答案 0 :(得分:4)

class Program
{
    static void Main(string[] args)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Configuration));
        var xml = 
@"<Configuration>
    <Config name=""SendToAddresses"">some value</Config>
    <Config name=""CCToAddresses""></Config>
    <Config name=""BCCAddresses""></Config>
  </Configuration>";
        using (var reader = new StringReader(xml))
        {
            var configuration = (Configuration)serializer.Deserialize(reader);
        }
    }
}

public class Configuration
{
    [XmlElement(ElementName="Config")]
    public Config[] Configs { get; set; }

}

public class Config
{
    [XmlAttribute(AttributeName = "name")]
    public string Name { get; set; }

    [XmlText]
    public string Value { get; set; }
}

答案 1 :(得分:0)

为了获得强类型,您必须创建XML模式 - 一个XSD文件,其中包含每个xml节点的定义和类型。 查看MSDN documentation了解相关信息。

答案 2 :(得分:0)

这就是你要找的东西:

    [XmlRoot("Configuration")]
    public class Configuration
    {
        [XmlElement("Config")]
        public List<Config> Configs { get; set; }
    }

    public class Config
    {
        [XmlAttribute("name")]
        public string Name { get; set; }
        [XmlText]
        public string Value { get; set; }

        public Config() { }
    }

    // ...

    XmlSerializer s = new XmlSerializer(typeof(Configuration));
    Configuration conf = (Configuration)s.Deserialize(new StringReader("INSERTXMLHERE"));

    foreach (var config in conf.Configs)
    {
        Console.WriteLine("{0} = {1}", config.Name, config.Value);
    }

答案 3 :(得分:0)

没有必要将xml文件反序列化为强类型对象以获得配置数组。

如果您能负担得起将xml文件更改为:

<Configuration>
  <SendToAddresses></SendToAddresses>
  <CCToAddresses></CCToAddresses>
  <BCCAddresses></BCCAddresses>
</Configuration>

按照以下简单步骤操作:

  1. 首先,您需要一个容器(一个对象)来将您的对象反序列化为。
  2. 使用XSD.exe也为您生成文件(XSD架构,然后从XSD架构生成CS文件)。
  3. 使用XSD.exe,您将在15分钟内设置并拥有一个很好的强类型配置对象。

答案 4 :(得分:0)

我认为您尝试解决的问题已经在System.Configuration命名空间中解决了?

我认为Jon Rista在Code Project上的this article概述了如何使用Configuration类,并且可以帮助您完成所需的工作。

如果这不完全符合您的需要,您可能需要考虑为项目制作序列化程序集,以便创建包含配置类的程序集。

每当我在编译期间没有创建反序列化器和序列化器类时,我遇到了反序列化和序列化的问题。随着时间的推移,您会发​​现在运行时创建的XmlSerialization类并不总是创建或可用,并且您将遇到错误。

最简单的方法是创建一个新的Assembly项目并添加一个带有公共读/写属性的Serializeable()类。然后你可以使用sgen在Post Build事件中创建一个序列化程序集,就像这样......

sgen / a:$(TargetFileName)/ force / verbose

然后你需要在你想要执行序列化的任何程序集中引用你的Serializable程序集。只要你的bin或探测路径中有AssemblyName.Serializable.Serializers可用,那么动态程序集就不会在运行时创建,您不会遇到错误。

完成后,您将能够序列化和反序列化序列化程序集中包含的类型。

...串行化

IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForAssembly();
using (IsolatedStorageFileStream stream = new
    IsolatedStorageFileStream(key, FileMode.Create, isolatedStorage))
{
    XmlSerializer serializer = new XmlSerializer(typeof(T));
    serializer.Serialize(stream, value);
}

反序列化

using (IsolatedStorageFile isolatedStorage = 
     IsolatedStorageFile.GetUserStoreForAssembly())
{
    using (IsolatedStorageFileStream stream = 
      new IsolatedStorageFileStream(
         key, FileMode.OpenOrCreate, FileAccess.ReadWrite, isolatedStorage))
    {
        if (stream.Length > 0)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            return (T)serializer.Deserialize(stream);
        }
        else
        {
            return default(T);
        }

    }
}