Сериализация и десериализация XML с использованием dot.net c # - PullRequest
0 голосов
/ 17 февраля 2011

Последние несколько часов я потратил на совмещение следующего кода после прочтения того, что кажется устаревшим или не совсем работает.

Если кто-то здесь поможет, это окончательный рабочий код. Бесплатное комментирование, если оно может быть улучшено: -)

public class SerializationHelper<T> {

#region static string SerializeObject( T obj, Encoding encoding )

/// <summary>
///   Serialize an [object] to an Xml String.
/// </summary>
/// <typeparam name="T">Object Type to Serialize</typeparam>
/// <param name="obj">Object Type to Serialize</param>
/// <param name="encoding">System.Text.Encoding Type</param>
/// <returns>Empty.String if Exception, XML string if successful</returns>
/// <example>
///   // UTF-16 Serialize
///   string xml = SerializationHelper<ObjectType>SerializeObject( [object], new UnicodeEncoding( false, false ) );
/// </example>
/// <example>
///   // UTF-8 Serialize
///   string xml = SerializationHelper<ObjectType>SerializeObject( [object], Encoding.UTF8 );
/// </example> 
public static string SerializeObject( T obj, Encoding encoding ) {

  if ( obj == null ) { return string.Empty; }

  try {

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

    using ( MemoryStream memoryStream = new MemoryStream() ) {

      XmlWriterSettings xmlWriterSettings = new XmlWriterSettings() { Encoding = encoding };

      using ( XmlWriter writer = XmlWriter.Create( memoryStream, xmlWriterSettings ) ) {

        xmlSerializer.Serialize( writer, obj );

      }

      return encoding.GetString( memoryStream.ToArray() );

    }

  }
  catch {

    return string.Empty;

  }

}

#endregion   

#region static T DeserializeObject( string xml, Encoding encoding )

/// <summary>
///   Deserialize an Xml String to an [object]
/// </summary>
/// <typeparam name="T">Object Type to Deserialize</typeparam>
/// <param name="xml">Xml String to Deserialize</param>
/// <param name="encoding">System.Text.Encoding Type</param>
/// <returns>Default if Exception, Deserialize object if successful</returns>
/// <example>
///   // UTF-16 Deserialize
///   [object] = SerializationHelper<ObjectType>DeserializeObject( xml, Encoding.Unicode )
/// </example>
/// <example>
///   // UTF-8 Deserialize
///   [object] = SerializationHelper<ObjectType>DeserializeObject( xml, Encoding.UTF8 )
/// </example> 
public static T DeserializeObject( string xml, Encoding encoding ) {

  if ( string.IsNullOrEmpty( xml ) ) { return default( T ); }

  try {

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

    using ( MemoryStream memoryStream = new MemoryStream( encoding.GetBytes( xml ) ) ) {

      // No settings need modifying here
      XmlReaderSettings  xmlReaderSettings  = new XmlReaderSettings();

      using ( XmlReader xmlReader = XmlReader.Create( memoryStream, xmlReaderSettings ) ) {

        return (T)xmlSerializer.Deserialize( xmlReader );

      }

    }

  }
  catch {

    return default( T );

  }

}

#endregion     

}

Ответы [ 2 ]

0 голосов
/ 17 февраля 2011

Я думаю, что нет необходимости для всей части кодирования.Вы просто сериализуетесь, используя одну кодировку, затем конвертируете в байты, а затем конвертируете обратно в Unicode.Это почему?Но я мог бы что-то упустить здесь.

Еще одна вещь, которая поражает меня - это использование .ToArray ().Если у вас большой объем и сериализация большого количества объектов, это может быть довольно тяжелым по производительности.Попробуйте использовать StreamReader для чтения потока памяти без необходимости копировать его в массив.Но это требует некоторого тестирования производительности для подтверждения моих рассуждений.

0 голосов
/ 17 февраля 2011

Я предлагаю переместить параметр типа T во включающий класс и сделать экземпляр XmlSerializer static.Статическое поле в универсальном классе относится к закрытому типу, поэтому SerializationHelper<Apple> и SerializationHelper<Orange> будут иметь отдельные экземпляры поля.

Кроме того, я не уверен, что catch { return String.Empty; } - лучшая идеялибо - проблемы с маскировкой, чтобы избежать сбоев, заставляют меня нервничать.

...