2013-03-09 63 views
0

我有一種方法可以序列化一個對象。例如序列化具有相同屬性變體的對象

List<Titles> lstCrmTitleSer = new List<Titles>(); 

我循環訪問字符串標題的集合,然後將它添加到類型標題的列表中以序列化它們。

foreach (var ls in lstCrmTitles) 
{ 
    Titles t = new Titles(); 

    t.title = ls; 
    lstCrmTitleSer.Add(t); 
} 

這是我的序列化對象的對象和方法。

static public void SerializeToXMLCollection(List<Titles> trainingTitles) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(List<Titles>)); 
    string path = string.Concat(@"C:\Users\Arian\Desktop\Titles.xml"); 
    Console.WriteLine(path); 
    TextWriter textWriter = new StreamWriter(path); 
    serializer.Serialize(textWriter, trainingTitles); 
    textWriter.Close(); 
} 

public string title { get; set; } 

的事情是我的XML文件顯示如下

<Titles> 
     <title>title a</title> 
</Titles> 
<Titles> 
     <title>title b</title> 
</Titles> 
<Titles> 
     <title>title c</title> 
</Titles> 

我想如果要顯示我的XML作爲跟隨

<Titles> 
     <title>title a</title> 
     <title>title b</title> 
     <title>title c</title> 
</Titles> 

我如何調整我的代碼爲了達到上述目標?

+0

你可以切換到[LINQ到XML](http://msdn.microsoft.com/en-us/library/bb387098.aspx)。這會起作用嗎? – Default 2013-03-09 13:29:17

+0

確實注意到你的建議意味着你不能反序列化它。這是你的問題嗎? – Default 2013-03-09 14:15:22

+0

反序列化也是一樣容易..我也有一個擴展,如果你想要它 – Matt 2013-03-09 14:27:13

回答

1

首先。這裏有一個通用的擴展方法給你使用..我幾年前寫它,它會序列化任何東西:

/// <summary> 
/// <para>Serializes the specified System.Object and writes the XML document</para> 
/// <para>to the specified file.</para> 
/// </summary> 
/// <typeparam name="T">This item's type</typeparam> 
/// <param name="item">This item</param> 
/// <param name="fileName">The file to which you want to write.</param> 
/// <returns>true if successful, otherwise false.</returns> 
public static bool XmlSerialize<T>(this T item, string fileName) 
{ 
    return item.XmlSerialize(fileName, true); 
} 

/// <summary> 
/// <para>Serializes the specified System.Object and writes the XML document</para> 
/// <para>to the specified file.</para> 
/// </summary> 
/// <typeparam name="T">This item's type</typeparam> 
/// <param name="item">This item</param> 
/// <param name="fileName">The file to which you want to write.</param> 
/// <param name="removeNamespaces"> 
///  <para>Specify whether to remove xml namespaces.</para>para> 
///  <para>If your object has any XmlInclude attributes, then set this to false</para> 
/// </param> 
/// <returns>true if successful, otherwise false.</returns> 
public static bool XmlSerialize<T>(this T item, string fileName, bool removeNamespaces) 
{ 
    object locker = new object(); 

    XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces(); 
    xmlns.Add(string.Empty, string.Empty); 

    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 

    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = true; 
    settings.OmitXmlDeclaration = true; 

    lock (locker) 
    { 
     using (XmlWriter writer = XmlWriter.Create(fileName, settings)) 
     { 
      if (removeNamespaces) 
      { 
       xmlSerializer.Serialize(writer, item, xmlns); 
      } 
      else { xmlSerializer.Serialize(writer, item); } 

      writer.Close(); 
     } 
    } 

    return true; 
} 

/// <summary> 
/// Serializes the specified System.Object and returns the serialized XML 
/// </summary> 
/// <typeparam name="T">This item's type</typeparam> 
/// <param name="item">This item</param> 
/// <param name="removeNamespaces"> 
///  <para>Specify whether to remove xml namespaces.</para>para> 
///  <para>If your object has any XmlInclude attributes, then set this to false</para> 
/// </param> 
/// <returns>Serialized XML for specified System.Object</returns> 
public static string XmlSerialize<T>(this T item, bool removeNamespaces = true) 
{ 
    object locker = new object(); 
    XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces(); 
    xmlns.Add(string.Empty, string.Empty); 

    XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 

    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = true; 
    settings.OmitXmlDeclaration = true; 

    lock (locker) 
    { 
     StringBuilder stringBuilder = new StringBuilder(); 
     using (StringWriter stringWriter = new StringWriter(stringBuilder)) 
     { 
      using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, settings)) 
      { 
       if (removeNamespaces) 
       { 
        xmlSerializer.Serialize(xmlWriter, item, xmlns); 
       } 
       else { xmlSerializer.Serialize(xmlWriter, item); } 

       return stringBuilder.ToString(); 
      } 
     } 
    } 
} 

其次。像這樣使用它:

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     var list = new MyObject(); 
     list.Titles.Add("title1"); 
     list.Titles.Add("title2"); 
     list.Titles.Add("title3"); 

     string serialized = list.XmlSerialize(); 

     //obviously here you would save to disk or whatever 
     Console.WriteLine(serialized); 
     Console.ReadLine(); 
    } 
} 

[XmlRoot("Titles")] 
public class MyObject 
{ 
    [XmlElement("title")] 
    public List<string> Titles { get; set; } 

    public MyObject() 
    { 
     Titles = new List<string>(); 
    } 
} 

第三,..代碼只是討厭。即使有了上述建議,我仍然認爲你需要做一些嚴肅的重構。

好運

BONUS

擴展deseralizing串到你的類型:

/// <summary> 
/// Deserializes the XML data contained by the specified System.String 
/// </summary> 
/// <typeparam name="T">The type of System.Object to be deserialized</typeparam> 
/// <param name="s">The System.String containing XML data</param> 
/// <returns>The System.Object being deserialized.</returns> 
public static T XmlDeserialize<T>(this string s) 
{ 
    if (string.IsNullOrEmpty(s)) 
    { 
     return default(T); 
    } 

    var locker = new object(); 
    var stringReader = new StringReader(s); 
    var reader = new XmlTextReader(stringReader); 
    try 
    { 
     var xmlSerializer = new XmlSerializer(typeof(T)); 
     lock (locker) 
     { 
      var item = (T)xmlSerializer.Deserialize(reader); 
      reader.Close(); 
      return item; 
     } 
    } 
    catch 
    { 
     return default(T); 
    } 
    finally 
    { 
     reader.Close(); 
    } 
} 

使用方法如下:

var myObject = someSerializedString.XmlDeserialize<MyObject>() 
+0

爲什麼他應該使用你的擴展方法?我沒有看到利潤。另外,OP似乎沒有任何'MyObject'類。那個是從哪裏來的?你的代碼與OP有很大的不同。你能擴展什麼「代碼看起來討厭」和OP可以做什麼使它看起來不討厭? – Default 2013-03-09 14:15:59

+0

我把它叫做MyObject,因爲我不知道OP想要調用那個類。我試過標題,但編譯器拋出一個錯誤,原因是你不能擁有和類本身一樣的屬性名稱。我會把它交給OP,在他認爲合適的時候改變。 – Matt 2013-03-09 14:21:37

+0

他不必使用我的擴展方法..但是它有什麼問題?它可以爲此工作,並且還可以爲他節省下來的麻煩,即需要隨時隨地將它寫入其他任何其他課程中,以便他將來可能要序列化的任何其他課程中。我多年來一直使用它,並且從不需要其他任何東西。你在做什麼大驚小怪? – Matt 2013-03-09 14:23:19

相關問題