C#Xml序列化问题

时间:2010-12-06 11:16:02

标签: c# serialization xml-serialization xmlserializer

我有xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LabelTypesCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance="xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <LabelTypes>    
    <LabelType>
      <Name>LabelTypeProduct</Name>
    </LabelType>
    <LabelType>
      <Name>LabelTypeClient</Name>
    </LabelType>    
  </LabelTypes>
</LabelTypesCollection>

和2个c#课程:

[Serializable]
[XmlRoot("LabelTypesCollection")]
public class LabelTypesCollection
{
    private static string _labelTypesCollectionPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Path.Combine(Program.ProgramName, "LabelTypesCollection.xml"));

    [XmlArray("LabelTypes", ElementName="LabelType")]
    public List<LabelType> LabelTypes { get; set; }

    public static LabelTypesCollection LoadAllLabelTypes()
    {
        FileInfo fi = new FileInfo(_labelTypesCollectionPath);
        if (!fi.Exists)
        {
            Logger.WriteLog("Could not find size_types_collection.xml file.", new Exception("Could not find size_types_collection.xml file."));
            return new LabelTypesCollection();
        }

        try
        {
            using (FileStream fs = fi.OpenRead())
            {
                XmlSerializer serializer = new XmlSerializer(typeof(LabelTypesCollection));
                LabelTypesCollection labelTypesCollection = (LabelTypesCollection)serializer.Deserialize(fs);
                return labelTypesCollection;
            }
        }
        catch (Exception ex)
        {
            Logger.WriteLog("Error during loading LabelTypesCollection", ex);
            return null;
        }
    }
}


[Serializable]    
public class LabelType
{
    [XmlElement("Name")]
    public string Name { get; set; }

    [XmlIgnore]
    public string TranslatedName
    {
        get
        {
            string translated = Common.Resources.GetValue(Name);
            return (translated == null) ? Name : translated;
        }
    }
}

当我打电话时:

LabelTypesCollection.LoadAllLabelTypes();

我获得带有空LabelTypes列表的LabelTypeCollection对象。没有任何错误或任何错误。有人能指出我的问题吗?

3 个答案:

答案 0 :(得分:2)

这是一个建议。

编写一个小型测试程序,创建LabelTypesCollection的实例,并在其中添加一些LabelType个对象。

然后使用XmlSerializer 对象写入文件,并查看您获得的Xml,以确保您的输入Xml处于正确的架构中。

也许你的某个Xml元素出了问题。

答案 1 :(得分:2)

更改此

[XmlArray("LabelTypes", ElementName="LabelType")]

到这个

[XmlArray]

ElementName的{​​{1}}指定容器的元素名称,实际上是您在ctor的第一个参数中指定的名称!所以你所说的“这个类序列化为一个名为XmlArrayAttribute的容器;实际上我没有等待我希望容器被命名为LabelTypes”。命名参数将覆盖第一个未命名参数所示的内容。

事实上,由于您希望容器元素名为LabelType,这实际上是成员调用的,因此您根本不需要指定它。

您可能一直在考虑LabelTypes,它控制序列化集合的各个成员的名称 - 但您也不需要这样。

我通常的解决xml序列化程序的方法是手动构建对象,然后查看它们序列化的xml。在这种情况下,使用您当前使用的代码生成xml,如下所示:

XmlArrayItemAttribute

这让我想到了错误的<?xml version="1.0" encoding="utf-16"?> <LabelTypesCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <LabelType> <LabelType> <Name>one</Name> </LabelType> <LabelType> <Name>two</Name> </LabelType> </LabelType> </LabelTypesCollection> 说明符。

请注意,您还不需要LabelType上的XmlRootLabelTypesCollection上的XmlElement,因为您只需指定xml序列化程序将会出现的内容无论如何。

答案 2 :(得分:0)

我真的认为你得到一个空列表,因为你的代码找不到xml文件。还尝试实例化您的列表。如果你有正确的xml路径。

public List<LabelType> LabelTypes = new List<LabelType>();