2010-12-06 46 views
1

我有xml文件:问题与C#XmlSerialization

<?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对象名单。没有任何错误或任何事情。任何人都可以指出我的问题吗?

+0

删除您的try-catch块,您可能有机会了解正在发生的事情。 – batwad 2010-12-06 11:19:54

+0

你检查了日志吗?我相信它无法找到该文件。什么是_labelTypesCollectionPath的值是 – 2010-12-06 11:20:33

+0

是的,我调试它和文件存在,它反序列化。我甚至去控制台,并在fs上创建StreamReader,调用它的ReadToEnd()和文件内容出现 – 2010-12-06 11:32:42

回答

2

更改此

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

这个

[XmlArray] 

ElementNameXmlArrayAttribute的指定容器的元素名称,实际上是你的第一个参数指定的构造函数是什么!所以你说ctor“这个班级序列化为一个名为LabelTypes的容器;实际上我没有等待容器被命名为LabelType”。指定的参数将覆盖第一个未命名参数所说的内容。

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

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

我通常的方法来制定xml序列化器的东西是手动建立对象,然后看看他们序列化的xml 。在这种情况下,使用您目前拥有的代码会产生这样的XML:

<?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符。

注意,你也不必在LabelTypesCollectionXmlRoot,或NameXmlElement,因为你只是指定XML序列化会想出什么样的呢。

0

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

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

这是一个建议。

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

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

也许你的一个Xml元素有问题。