无法使用DataContractSerializer获取元素列表

时间:2013-01-16 23:59:14

标签: c# datacontract

我无法从XML中检索“test”元素的集合。 我无法弄清楚我的语法有什么问题。

以下是XML:

<tests>
  <username>Me</username>
  <password>meme</password>
  <test>
    <title>Test This</title>
    <description>To verify this</description>
  </test>
  <test>
    <title>Test That</title>
    <description>To verify that</description>
  </test>
</tests>

这是C#类:

namespace MyProject
{
    public class Temp
    {
        [DataContract(Name = "tests", Namespace = "")]
        public class Tests
        {
            [DataMember(Name = "username", Order = 0)]
            public string Username { get; set; }

            [DataMember(Name = "password", Order = 1)]
            public string Password { get; set; }

            [DataMember(Name = "test", Order = 2)]
            public List<Test> testList;

            public Tests()
            {
            }

        }

        [DataContractCollection(Name = "test", Namespace = "")]
        public class Test : List<Test>
        {
            [DataMember(Name = "title", Order = 0)]
            public string Title { get; set; }

            [DataMember(Name = "description", Order = 1)]
            public string Description{ get; set; }

            public Test()
            { }

            public Test(String title, String desc)
            {
                this.Title = title;
                this.Description= desc;
            }


        }

    }
}

我的序列化代码:

FileStream fs = new FileStream("C:/bla/file.xml", FileMode.Open);
XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
DataContractSerializer serializer = new DataContractSerializer(typeof(Temp3.TestGroup), knownTypeList);
Tests tests = (Tests)serializer.ReadObject(reader, true);
reader.Close();
fs.Close();

在调试模式下,tests.testList什么都没有。 如果我要将public List<Test> testList;更改为public Test testList;,我会得到第一个测试元素。我也尝试过使用Test []或ArrayList。

可以指出出了什么问题吗?非常感谢。

作为一个附带问题,是否有XML的DataContractSerialization(具有深层嵌套元素)的详细示例?我发现的大多数都是非常基本的。

1 个答案:

答案 0 :(得分:0)

嗯,我想我已经弄清楚了 - 至少部分是这样。 多亏了这个: http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html

我发现的其他事情是我必须删除订单 [DataMember(Name =“test”,Order = 2)] public List testList

使用博客中的示例,我的测试元素将被testlist括起来。因此,testlist是一个额外的元素。