2015-04-04 86 views
0

所以我需要xml序列化一個對象的通用列表,其中對象由另一個列表和一個字符串組成。XMLserialize對象的列表和字符串

這就是我現在得到

<?xml version="1.0" encoding="UTF-8"?> 

-<ArrayOfRecept xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 


-<Recept> 
<Namn>Nomnom</Namn>  
</Recept> 

-<Recept>  
<Namn>Ännu mer nomnom</Namn>  
</Recept> 

</ArrayOfRecept> 

這裏隻字符串值是序列化,而不是我的列表

這是我的目標,我要序列

public class Recept 
    { 

     private ListHanterare<string> ingredienser; 
     private string namn; 

     public Recept() 
     { 
      ingredienser = new ListHanterare<string>(); 
     } 
     public ListHanterare<string> Ingredienser 
     { 
      get { return ingredienser; } 

     } 

     public string Namn 
     { 
      get { return namn; } 
      set { namn = value; } 
     } 

    } 

所以我將有一個我想要xml序列化的Recept列表,並且我希望xml顯示「Namn」和「Ingredienser」列表。

這是我的串行

class XMLSerial 
    { 
     public static bool Serialize<T>(T obj, string filePath) 
     { 
      bool bok = true; 

      XmlSerializer serializer = new XmlSerializer(typeof(T)); 
      TextWriter writer = new StreamWriter(filePath); 
      try 
      { 
       serializer.Serialize(writer, obj); 
      } 
      catch 
      { 
       bok = false; 
      } 
      finally 
      { 
       if (writer != null) 

        writer.Close(); 
      } 

      return bok; 
     } 

    } 

這是ListHanterare類,我的對象傳遞給串行內

public bool XMLSerialize(string filePath){ 
      return XMLSerial.Serialize<List<T>>(lista, filePath); 

編輯: 所以通過添加二傳手到ingredienser現在我得到這個

-<Recept> 
<Ingredienser/> 
<Namn>rec</Namn> 
</Recept> 

但ingredienser仍然是空的 我ListHanterare類是基本泛型列表類

public class ListHanterare<T> : IListHanterare<T> 
    { 

     private List<T> lista; // This is the list 
     private int count; 

     public ListHanterare() 
     { 
      lista = new List<T>(); 

     } 

所以我需要序列招待的ListHanterare對象列表,其中招待對象由一個字符串,字符串的另一ListHanterare列表,字符串正確但不連載字符串列表。

+0

將XML元素添加到您的Recept類中,以便序列化程序知道要反序列化的內容。此外,你不是反序列化你的元素,你只是流,並返回值爲真 - 布爾。你沒有回報任何錯誤或真實的東西。 – Aizen 2015-04-05 00:28:25

+0

我在我的類聲明上面有一個[Serializable] – user3621898 2015-04-05 12:30:59

+0

''''[Serializable]'用於二進制格式化而不是'XmlSerializer'。 – dbc 2015-04-05 18:56:31

回答

0

爲了XmlSerializer序列化或反序列化Recept類的屬性Ingredienser,它必須有一個公共的setter以及一個公共的getter:

public ListHanterare<string> Ingredienser 
    { 
     get { return ingredienser; } 
     set { ingredienser = value; } 
    } 

如果你不這樣做,將XmlSerializer忽略財產。

您可能仍然遇到類ListHanterare的問題,但未在您的問題中顯示。

DataContractSerializer沒有此要求。但是,要使用DataContractSerializer序列化和反序列化您的類幷包含私有字段或屬性,則需要使用data contract attributes完全註釋它們。私人領域和標有[DataMember]的財產儘管是私人的,但會被序列化。數據合同序列號是opt-in,但是,要使用此功能,您的類需要完全歸屬。

更新

你不顯示您的ListHanterare<string>類的完整代碼。爲了XmlSerializer序列化和成功反序列化,它必須是:XmlSerializer Class:這裏所描述

  1. 使公衆可設置和gettable性能提供其所有內容,還是
  2. 實現ICollection<T>(甚至IList<T>)。

對於方法#1,你可以修改你的類,如下所示:

public class ListHanterare<T> 
{ 
    private List<T> lista; // This is the list 
    private int count; 

    public ListHanterare() 
    { 
     lista = new List<T>(); 
    } 

    [XmlElement("Item")] 
    public T[] SerializableList 
    { 
     get 
     { 
      return (lista == null ? new T [0] : lista.ToArray()); 
     } 
     set 
     { 
      if (lista == null) 
       lista = new List<T>(); 
      lista.Clear(); 
      lista.AddRange(value ?? Enumerable.Empty<T>()); 
      count = lista.Count; 
     } 
    } 
} 

現在,您將看到的物品序列化的XML。

+0

通過給它一個二傳手給了我這個結果 嘿嘿 將使用的DataContractSerializer解決這一問題? – user3621898 2015-04-05 11:49:12

+0

@ user3621898 - 你的ListHanterare類是什麼樣的?如果其內容未被序列化,則問題可能在那裏。 – dbc 2015-04-05 14:43:50

+0

@ user3621898 - 可能你的'ListHanterare'沒有'XmlSerializer'所需的公共可設置的屬性 - 但我不能肯定地說。你可以顯示ListHanterare的完整代碼嗎? – dbc 2015-04-05 18:56:13