分享一个对象序列化为XML和反序列化的扩展方法
2010-12-20 16:40
459 查看
public static class XmlSerializerExtensions
{
#region Private fields
private static readonly Dictionary<RuntimeTypeHandle, XmlSerializer> ms_serializers = new Dictionary<RuntimeTypeHandle, XmlSerializer>();
#endregion
#region Public methods
/// <summary>
/// 序列化对象为xml字符串
/// </summary>
/// <typeparam name = "T"></typeparam>
/// <param name = "value"></param>
/// <returns></returns>
public static string ToXml<T>(this T value)
where T : new()
{
var _serializer = GetValue(typeof(T));
using (var _stream = new MemoryStream())
{
using (var _writer = new XmlTextWriter(_stream, new UTF8Encoding()))
{
_serializer.Serialize(_writer, value);
return Encoding.UTF8.GetString(_stream.ToArray());
}
}
}
/// <summary>
/// 反序列化xml字符串为对象
/// </summary>
/// <typeparam name = "T">要序列化成何种对象</typeparam>
/// <param name = "srcString">xml字符串</param>
/// <returns></returns>
public static T FromXml<T>(this string srcString)
where T : new()
{
var _serializer = GetValue(typeof(T));
using (var _stringReader = new StringReader(srcString))
{
using (XmlReader _reader = new XmlTextReader(_stringReader))
{
return (T)_serializer.Deserialize(_reader);
}
}
}
#endregion
#region Private methods
private static XmlSerializer GetValue(Type type)
{
XmlSerializer _serializer;
if (!ms_serializers.TryGetValue(type.TypeHandle, out _serializer))
{
lock (ms_serializers)
{
if (!ms_serializers.TryGetValue(type.TypeHandle, out _serializer))
{
_serializer = new XmlSerializer(type);
ms_serializers.Add(type.TypeHandle, _serializer);
}
}
}
return _serializer;
}
#endregion
}
{
#region Private fields
private static readonly Dictionary<RuntimeTypeHandle, XmlSerializer> ms_serializers = new Dictionary<RuntimeTypeHandle, XmlSerializer>();
#endregion
#region Public methods
/// <summary>
/// 序列化对象为xml字符串
/// </summary>
/// <typeparam name = "T"></typeparam>
/// <param name = "value"></param>
/// <returns></returns>
public static string ToXml<T>(this T value)
where T : new()
{
var _serializer = GetValue(typeof(T));
using (var _stream = new MemoryStream())
{
using (var _writer = new XmlTextWriter(_stream, new UTF8Encoding()))
{
_serializer.Serialize(_writer, value);
return Encoding.UTF8.GetString(_stream.ToArray());
}
}
}
/// <summary>
/// 反序列化xml字符串为对象
/// </summary>
/// <typeparam name = "T">要序列化成何种对象</typeparam>
/// <param name = "srcString">xml字符串</param>
/// <returns></returns>
public static T FromXml<T>(this string srcString)
where T : new()
{
var _serializer = GetValue(typeof(T));
using (var _stringReader = new StringReader(srcString))
{
using (XmlReader _reader = new XmlTextReader(_stringReader))
{
return (T)_serializer.Deserialize(_reader);
}
}
}
#endregion
#region Private methods
private static XmlSerializer GetValue(Type type)
{
XmlSerializer _serializer;
if (!ms_serializers.TryGetValue(type.TypeHandle, out _serializer))
{
lock (ms_serializers)
{
if (!ms_serializers.TryGetValue(type.TypeHandle, out _serializer))
{
_serializer = new XmlSerializer(type);
ms_serializers.Add(type.TypeHandle, _serializer);
}
}
}
return _serializer;
}
#endregion
}
相关文章推荐
- 对象,对象集合的简单Xml序列化与反序列化 【实用代码,含泛型方法】
- 一个经过改良的XMLHelper(包含了序列化,反序列化,创建xml文件,读取节点,C#对象与xml文件的相互转换等等。)
- 类对象序列化(反序列化)成xml文件或者二进制文件到本地文件方法
- 使用XML 序列化和反序列化类对象的方法
- XmlSerializer 对象的Xml序列化和反序列化
- 一个经过改良的XMLHelper(包含了序列化,反序列化,创建xml文件,读取节点
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- jquery将一个表单序列化为一个对象的方法
- C#对象XML序列化(一):序列化方法和常用特性
- C# XmlSerializer 对象的Xml序列化和反序列化
- 分享:将XML(VS提取注释时生成)转换为Chm的一个方法
- Java对象的XML序列化和反序列化 - (2)
- 用 XStream 序列化/反序列化 XML 为 Java 对象(实例)
- 基于jQuery的一个扩展form序列化到json对象
- MVC为Html对象建立一个扩展方法,使用自己的控件就像使用TextBox一样方便
- 利用扩展方法重写JSON序列化和反序列化
- (Tips)Java对象的XML序列化和反序列化 - (1)
- 给 Javascript 的 日期(Date)对象扩展一个格式化(format)方法
- Java中对象的序列化和反序列化方法
- 使用序列化和反序列化来存储一个对象案例