【问题标题】:Serialize and Deserialize XML using dot.net c#使用 dot.net c# 序列化和反序列化 XML
【发布时间】:2011-06-28 20:42:49
【问题描述】:

在阅读了许多似乎过时或似乎不太有效的代码后,我花了几个小时整理了以下代码。

如果它对这里的任何人有任何帮助,那就是最终的工作代码。如果可以改进,请免费评论:-)

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     

}

【问题讨论】:

  • 好的,这就是代码 - 那么你的问题是什么?!?!您是否收到错误 - 如果是:what 错误?代码没有按照您的预期执行吗?如果是这样:你期望什么,你会得到什么?阅读how to ask a good question on SO
  • 与其说是一个问题,不如说是一个概述,看看它是否正确以及是否可以改进。在阅读了很多谷歌之后,我遇到了许多不同版本的代码,正如我所说,大多数都使用过时的方法,有些显然不起作用。我还注意到,在这里,尤其是很多人输入答案,例如“我刚刚从我的脑海中输入了这个,它可能会起作用我不确定,但你明白了”这是一个很好的姿态,但有时在这里找到代码不是很好实际可行,经过测试并被其他人认为是最佳实践,同时添加输入。

标签: c# serialization xmlreader xmlwriter


【解决方案1】:

我建议将类型参数T 移动到封闭类,并使XmlSerializer 实例static。泛型类中的静态字段是每个封闭类型的,因此SerializationHelper&lt;Apple&gt;SerializationHelper&lt;Orange&gt; 将分别具有该字段的单独实例。

另外,我也不确定catch { return String.Empty; } 是不是最好的主意——掩盖问题以避免崩溃让我很紧张。

【讨论】:

    【解决方案2】:

    我认为不需要整个编码部分。您只需使用一种编码进行序列化,然后转换为字节,然后再转换回 Unicode。这是为什么?但我可能在这里遗漏了一些东西。

    让我印象深刻的另一件事是 .ToArray() 的用法。如果您有很大的层次结构并序列化大量对象,那么这可能会导致性能非常高。尝试使用 StreamReader 读取内存流,而无需将其复制到 Array 中。但这需要一些性能测试来支持我的推理。

    【讨论】:

      猜你喜欢
      • 2012-02-02
      • 2011-05-12
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 2012-09-08
      相关资源
      最近更新 更多