将类列表序列化为XML [英] Serializing Lists of Classes to XML

查看:71
本文介绍了将类列表序列化为XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些要序列化为XML文件的类的集合。看起来像这样:

I have a collection of classes that I want to serialize out to an XML file. It looks something like this:

public class Foo
{
  public List<Bar> BarList { get; set; }
}

其中条形图只是一组属性的包装:

Where a bar is just a wrapper for a collection of properties, like this:

public class Bar
{
  public string Property1 { get; set; }
  public string Property2 { get; set; }
}

我要对此进行标记,以便将其输出到XML文件-这将用于持久性,还用于通过XSLT将设置呈现为易于阅读的格式。

I want to mark this up so that it outputs to an XML file - this will be used for both persistence, and also to render the settings via an XSLT to a nice human-readable form.

我想获得一个很好的XML表示形式:

I want to get a nice XML representation like this:

<?xml version="1.0" encoding="utf-8"?>
<Foo>
  <BarList>
    <Bar>
      <Property1>Value</Property1>
      <Property2>Value</Property2>   
    </Bar>
    <Bar>
      <Property1>Value</Property1>
      <Property2>Value</Property2>   
    </Bar>
  </Barlist>
</Foo>

Barlist中的所有Bars的所有属性均被写出。我相当确定我需要在类定义上加一些标记才能使其正常工作,但我似乎找不到正确的组合。

where are all of the Bars in the Barlist are written out with all of their properties. I'm fairly sure that I'll need some markup on the class definition to make it work, but I can't seem to find the right combination.

ve用属性

[XmlRoot("Foo")]  

list< Bar>

[XmlArray("BarList"), XmlArrayItem(typeof(Bar), ElementName="Bar")]

试图告诉序列化程序我想要发生什么。但是,这似乎不起作用,我只是得到一个空标签,看起来像这样:

in an attempt to tell the Serializer what I want to happen. This doesn't seem to work however and I just get an empty tag, looking like this:

<?xml version="1.0" encoding="utf-8"?>
<Foo> 
  <Barlist />
</Foo>

我不确定我使用自动属性的事实是否会产生效果,或者使用仿制药需要任何特殊待遇。我已经将其与更简单的类型(例如字符串列表)一起使用,但是到目前为止,类列表仍然使我难以理解。

I'm not sure if the fact I'm using Automatic Properties should have any effect, or if the use of generics requires any special treatment. I've gotten this to work with simpler types like a list of strings, but a list of classes so far eludes me.

推荐答案

只是检查一下,您是否将Bar标记为[可序列化]?

Just to check, have you marked Bar as [Serializable]?

此外,您还需要在Bar上使用一个无参数的ctor来反序列化

Also, you need a parameter-less ctor on Bar, to deserialize

嗯,我用过:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {

        Foo f = new Foo();

        f.BarList = new List<Bar>();

        f.BarList.Add(new Bar { Property1 = "abc", Property2 = "def" });

        XmlSerializer ser = new XmlSerializer(typeof(Foo));

        using (FileStream fs = new FileStream(@"c:\sertest.xml", FileMode.Create))
        {
            ser.Serialize(fs, f);
        }
    }
}

public class Foo
{
    [XmlArray("BarList"), XmlArrayItem(typeof(Bar), ElementName = "Bar")]
    public List<Bar> BarList { get; set; }
}

[XmlRoot("Foo")]
public class Bar
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

结果如下:

<?xml version="1.0"?>
<Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <BarList>
    <Bar>
      <Property1>abc</Property1>
      <Property2>def</Property2>
    </Bar>
  </BarList>
</Foo>

这篇关于将类列表序列化为XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆