2010-12-06 78 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元素有問題。