2015-04-04 85 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