2013-03-09 3 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

+0

Обратите внимание, что ваше предложение будет означать, что вы не можете десериализовать его. Это проблема для вас? – Default

+0

Deserializing так же просто .. У меня есть расширение для этого тоже, если вы этого хотите – Matt

ответ

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>(); 
    } 
} 

В-третьих, этот код просто противный. Даже с приведенным выше предложением, я все еще думаю, что вам нужно сделать серьезный рефакторинг.

Успехов

БОНУС

Удлинитель 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

Почему он должен использовать ваш метод расширения? Я не вижу в этом прибыли. Кроме того, у ОП нет класса 'MyObject'. Откуда это пришло? Ваш код сильно отличается от OP. Не могли бы вы рассказать о том, что «код выглядит противным» и что может сделать OP, чтобы он не выглядел противным? – Default

+0

Я назвал его MyObject, потому что я не знаю, что OP хочет назвать этим классом. Я пробовал титры, но компилятор забросил ошибку по той причине, что вы не можете иметь имена свойств так же, как и сам класс. Я оставлю его в ОП, чтобы поменять его, как он считает нужным. – Matt

+0

И он не должен использовать мой метод расширения .. но в чем проблема с ним? Он работает для этого и также избавит его от необходимости постоянно писать его ad-hoc везде для любых других классов, которые он, возможно, захочет сериализовать в будущем. Я использовал это в течение многих лет и никогда не нуждался в чем-либо еще. О чем ты беспокоишься? – Matt

Смежные вопросы