序列化和使用dot.net C#XML反序列化 [英] Serialize and Deserialize XML using dot.net c#

查看:277
本文介绍了序列化和使用dot.net C#XML反序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经读太多,似乎过时了,或者一点儿也不十分似乎工作后,花了几个小时,把togeather下面的代码。



如果其任何人在这里的任何帮助是最后的工作代码。自由随意评论,如果能加以改进: - )

 公共类SerializationHelper< T> {

#地区的静态字符串SerializeObject(T OBJ,编码编码)

///<总结>
///序列化[对象]到一个XML字符串。
///< /总结>
///< typeparam NAME =T>对象类型序列化和LT; / typeparam>
///< PARAM NAME =目标文件>对象类型序列化和LT; /参数>
///< PARAM NAME =编码> System.Text.Encoding类型< /参数>
///<退货和GT; Empty.String如果异常,XML字符串如果成功< /回报>
///&所述;示例>
/// // UTF-16序列化
///字符串XML = SerializationHelper<&对象类型GT; SerializeObject([对象],新UnicodeEncoding(假,假));
///< /示例>
///&所述;示例>
/// // UTF-8序列化
///字符串XML = SerializationHelper<&对象类型GT; SerializeObject([对象],Encoding.UTF8);
///< /示例>
公共静态字符串SerializeObject(T OBJ,编码编码){

如果(OBJ == NULL){返回的String.Empty; }

尝试{

的XmlSerializer XmlSerializer的=新的XmlSerializer(typeof运算(T));使用(MemoryStream的MemoryStream的=新的MemoryStream()){

XmlWriterSettings xmlWriterSettings =新XmlWriterSettings(){编码=编码}

;

使用(XmlWriter的作家= XmlWriter.Create(MemoryStream的,xmlWriterSettings)){

xmlSerializer.Serialize(作家,OBJ);

}

返回encoding.GetString(memoryStream.ToArray());

}

}
抓{

返回的String.Empty;

}

}

#endregion

#地区的静态牛逼DeserializeObject(XML字符串编码编码)

///<总结>
///反序列化的XML字符串到[对象]
///< /总结>
///< typeparam NAME =T>对象类型进行反​​序列化< / typeparam>
///< PARAM NAME =XML> XML字符串反序列化< /参数>
///< PARAM NAME =编码> System.Text.Encoding类型< /参数>
///<退货和GT;默认,如果异常,如果反序列化对象的成功与LT; /回报>
///&所述;示例>
/// // UTF-16反序列化
/// [对象] = SerializationHelper<&对象类型GT; DeserializeObject(XML,Encoding.Unicode)
///< /示例>
///&所述;示例>
/// // UTF-8反序列化
/// [对象] = SerializationHelper<&对象类型GT; DeserializeObject(XML,Encoding.UTF8)
///< /示例>
公共静态牛逼DeserializeObject(XML字符串编码编码){

如果(string.IsNullOrEmpty(XML)){返回默认值(T); }

尝试{

的XmlSerializer XmlSerializer的=新的XmlSerializer(typeof运算(T));

使用(MemoryStream的MemoryStream的=新的MemoryStream(encoding.GetBytes(XML))){

//没有设置需要修改这里
XmlReaderSettings xmlReaderSettings =新XmlReaderSettings( );使用(XmlReader中的XMLReader = XmlReader.Create(MemoryStream的,xmlReaderSettings)){

回报率(T)xmlSerializer.Deserialize(的XMLReader)

;

}

}

}
抓{

返回默认值(T);

}

}

#endregion

}


解决方案

我建议移动类型参数 T 来封闭类并且使的XmlSerializer 实例静态。在泛型类的静态字段是每封闭式,所以 SerializationHelper<苹果> SerializationHelper<橙色> 将每。有外地的单独实例



此外,我不知道,抓{返回的String.Empty; } 是最好的主意 - 屏蔽的问题,以避免崩溃让我很紧张


I have spent the last few hours putting togeather the following code after reading much that seems out of date or that does'nt quite seem to work.

If its any help to anybody here is the final working code. Free free to comment if it can be improved :-)

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     

}

解决方案

I suggest moving the type parameter T to the enclosing class and making the XmlSerializer instance static. A static field in a generic class is per closed type, so SerializationHelper<Apple> and SerializationHelper<Orange> will each have separate instances of the field.

Also, I'm not sure that catch { return String.Empty; } is the best idea either -- masking problems to avoid crashing makes me nervous.

这篇关于序列化和使用dot.net C#XML反序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆