2010-10-27 53 views
0

有沒有人有支持集合的對象序列化實現,如ICollection,IEnumerable,IList,IDictionary?集合類型的XML序列化

下面是我的實現,它不是那麼幹淨。

[Serializable] 
public abstract class IXmlable 
{ 
    public virtual string ToXml() 
    { 
     Type type = GetType(); 
     PropertyInfo[] properties = type.GetProperties(); 

     string ret = "<" + type.Name + ">"; 
     foreach (PropertyInfo item in properties) 
     { 
      object value = item.GetValue(this, null); 
      if (value is IConvertible) 
       ret += ("<" + item.Name + ">" + (value as IConvertible).ToString(CultureInfo.GetCultureInfo("en-US")) + "</" + item.Name + ">").Replace("&", "&amp;"); 
      else 
       ret += ("<" + item.Name + ">" + (value != null ? value.ToString() : String.Empty) + "</" + item.Name + ">").Replace("&", "&amp;"); 
     } 
     ret += "</" + type.Name + ">"; 
     return ret; 
    } 

/// <summary> 
/// A class for serializing objects 
/// </summary> 
public static class Serializer 
{ 
    public static string ToXML<T>(this List<T> parameter) 
    { 
     return SerializeObject(parameter); 
    } 

    /// <summary> 
    /// This function serialize object. 
    /// </summary> 
    /// <param name="parameters">The object to be serialize</param> 
    /// <returns>Returns the XML presentation of serialized object</returns> 
    public static string SerializeObject(params object[] parameters) 
    { 
     var doc = new XDocument(new XElement("root")); 
     string swString = string.Empty; 
     foreach (var parameter in parameters) 
     { 
      var list = parameter as IEnumerable; 
      IXmlable xmlable; 
      if (list != null) 
      { 
       Type type = list.GetType().GetGenericArguments()[0]; 
       if (type.BaseType != null && type.BaseType.Name == "IXmlable") 
       { 
        string typeName = type.Name; 
        swString = "<?xml version=\"1.0\"?><ArrayOf" + typeName + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"; 
        swString = list.Cast<IXmlable>().Aggregate(swString, (current, item) => current + item.ToXml()); 
        swString += "</ArrayOf" + typeName + ">"; 
       } 
      } 
      else if ((xmlable = parameter as IXmlable) != null) 
      { 
       swString = xmlable.ToXml(); 
      } 
      else 
      { 
       swString = Serialize(parameter); 
      } 

      doc.Root.Add(XDocument.Parse(swString).Root); 
     } 
     return doc.ToString(); 
    } 

    /// <summary> 
    /// Serializes the specified parameter. 
    /// </summary> 
    /// <param name="parameter">The parameter.</param> 
    /// <returns></returns> 
    private static string Serialize(object parameter) 
    { 
     using (var sw = new MemoryStream()) 
     { 
      new XmlSerializer(parameter.GetType()).Serialize(sw, parameter); 
      sw.Position = 0; 
      var buffer = new byte[sw.Length]; 
      sw.Read(buffer, 0, (int)sw.Length); 
      return Encoding.Default.GetString(buffer); 
     } 
    } 
} 
+0

的ICollection,IEnumerable的,IList的,IDictionary的**不是**「通用」,」類型...? – 2010-10-27 10:14:47

+0

沒有你的權利,他們與普通類型的集合接口。 – 2010-10-27 10:34:03

回答

0

,你應該有一個像

private static void Save(T yourobject, Type[] extraTypesInyourObject, string path) 
{ 
    using (TextWriter textWriter = new TextWriter(path)) 
    { 
     XmlSerializer xmlSerializer = CreateXmlSerializer(extraTypes); 
     xmlSerializer.Serialize(textWriter, yourobject); 
    } 
} 

    private static XmlSerializer CreateXmlSerializer(Type[] extraTypes) 
    { 
     Type ObjectType = typeof(T); 
     XmlSerializer xmlSerializer = null; 
     if (extraTypes!=null) 
     { 
      xmlSerializer = new XmlSerializer(ObjectType, extraTypes); 
     } 
     else 
     { 
      xmlSerializer = new XmlSerializer(ObjectType); 
     } 

     return xmlSerializer; 
    } 
+0

你的代碼支持列表,而不是字典 – 2010-10-27 11:09:58

+0

System.Collections.Generic.Dictionary'2 [[System.String,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.String,mscorlib,Version = 4.0.0.0,Culture如果你的字典有你自己的類對象,你應該將它添加到extraTypes類型數組中...類型[] extraTypes = new Type [] {Dictionary <= null,PublicKeyToken = b77a5c561934e089]]不支持,因爲它實現了IDictionary – 2010-10-27 11:19:45

+0

yourObject,object>}然後創建xml序列化器。 – Kubi 2010-10-27 13:55:17