数据序列化之经验积累(2) -- Datacontract formatter
2009-03-26 13:44
316 查看
此文中的序列化类,主要是利用DataContractSerializer 来实现,对于标注了Datacontract的类特别有用。
二进制序列化:
public static class DataContractFormatSerializer
{
public static string SerializeToBase64String<T>(T obj, bool compress)
{
byte[] ret = Serialize<T>(obj, compress);
return Convert.ToBase64String(ret);
}
public static byte[] Serialize<T>(T obj, bool compress)
{
if (obj == null)
{
return null;
}
byte[] info;
using (MemoryStream stream = new MemoryStream())
{
DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
using (XmlDictionaryWriter binaryDictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(stream))
{
serializer.WriteObject(binaryDictionaryWriter, obj);
binaryDictionaryWriter.Flush();
}
info = stream.ToArray();
if (compress)
{
info = CompressHelper.CompressBytes(info);
}
}
return info;
}
public static T DeserializeFromBase64String<T>(string baseString, bool decompress)
{
if (String.IsNullOrEmpty(baseString))
return default(T);
byte[] buffer = Convert.FromBase64String(baseString);
return Deserialize<T>(buffer, decompress);
}
public static T Deserialize<T>(byte[] info, bool decompress)
{
T ret = default(T);
if (info == null || info.Length <= 0)
{
return ret;
}
if (decompress)
{
info = CompressHelper.DeCompressBytes(info);
}
using (MemoryStream stream = new MemoryStream(info))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
using (XmlDictionaryReader binaryDictionaryReader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
{
ret = (T)serializer.ReadObject(binaryDictionaryReader);
}
}
return ret;
}
}
xml:
public static class DataContractXmlSerializer
{
public static string Serialize<T>(T obj)
{
if (obj == null)
{
return null;
}
string ret = "";
using (MemoryStream stream = new MemoryStream())
{
DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
using (XmlDictionaryWriter binaryDictionaryWriter = XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8))
{
serializer.WriteObject(binaryDictionaryWriter, obj);
binaryDictionaryWriter.Flush();
}
ret = Encoding.UTF8.GetString(stream.ToArray());
}
return ret;
}
public static T Deserialize<T>(string xml)
{
T ret = default(T);
if (string.IsNullOrEmpty(xml))
{
return ret;
}
using (MemoryStream stream = new MemoryStream())
{
byte[] bytes = Encoding.UTF8.GetBytes(xml);
stream.Write(bytes, 0, bytes.Length);
stream.Position = 0L;
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
using (XmlDictionaryReader binaryDictionaryReader = XmlDictionaryReader.CreateTextReader(stream, XmlDictionaryReaderQuotas.Max))
{
ret = (T)serializer.ReadObject(binaryDictionaryReader);
}
}
return ret;
}
}
经过测试,本文中的序列化类,比Binary Formatter,速度要快,序列化后的结果要小,当然前提是类要用Datacontract标注,否则基本是一样的。
二进制序列化:
public static class DataContractFormatSerializer
{
public static string SerializeToBase64String<T>(T obj, bool compress)
{
byte[] ret = Serialize<T>(obj, compress);
return Convert.ToBase64String(ret);
}
public static byte[] Serialize<T>(T obj, bool compress)
{
if (obj == null)
{
return null;
}
byte[] info;
using (MemoryStream stream = new MemoryStream())
{
DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
using (XmlDictionaryWriter binaryDictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(stream))
{
serializer.WriteObject(binaryDictionaryWriter, obj);
binaryDictionaryWriter.Flush();
}
info = stream.ToArray();
if (compress)
{
info = CompressHelper.CompressBytes(info);
}
}
return info;
}
public static T DeserializeFromBase64String<T>(string baseString, bool decompress)
{
if (String.IsNullOrEmpty(baseString))
return default(T);
byte[] buffer = Convert.FromBase64String(baseString);
return Deserialize<T>(buffer, decompress);
}
public static T Deserialize<T>(byte[] info, bool decompress)
{
T ret = default(T);
if (info == null || info.Length <= 0)
{
return ret;
}
if (decompress)
{
info = CompressHelper.DeCompressBytes(info);
}
using (MemoryStream stream = new MemoryStream(info))
{
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
using (XmlDictionaryReader binaryDictionaryReader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
{
ret = (T)serializer.ReadObject(binaryDictionaryReader);
}
}
return ret;
}
}
xml:
public static class DataContractXmlSerializer
{
public static string Serialize<T>(T obj)
{
if (obj == null)
{
return null;
}
string ret = "";
using (MemoryStream stream = new MemoryStream())
{
DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
using (XmlDictionaryWriter binaryDictionaryWriter = XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8))
{
serializer.WriteObject(binaryDictionaryWriter, obj);
binaryDictionaryWriter.Flush();
}
ret = Encoding.UTF8.GetString(stream.ToArray());
}
return ret;
}
public static T Deserialize<T>(string xml)
{
T ret = default(T);
if (string.IsNullOrEmpty(xml))
{
return ret;
}
using (MemoryStream stream = new MemoryStream())
{
byte[] bytes = Encoding.UTF8.GetBytes(xml);
stream.Write(bytes, 0, bytes.Length);
stream.Position = 0L;
DataContractSerializer serializer = new DataContractSerializer(typeof(T));
using (XmlDictionaryReader binaryDictionaryReader = XmlDictionaryReader.CreateTextReader(stream, XmlDictionaryReaderQuotas.Max))
{
ret = (T)serializer.ReadObject(binaryDictionaryReader);
}
}
return ret;
}
}
经过测试,本文中的序列化类,比Binary Formatter,速度要快,序列化后的结果要小,当然前提是类要用Datacontract标注,否则基本是一样的。
相关文章推荐
- 数据序列化处理之经验积累(2) -- Datacontract formatter
- 数据序列化之经验积累(2) -- Datacontract formatter
- 数据序列化处理之经验积累(1)-BinaryFormatter
- 数据序列化处理之经验积累(3) -- ObjectStateFormatter
- 数据序列化处理之经验积累(1)-BinaryFormatter
- 数据序列化处理之经验积累(1)-BinaryFormatter
- 数据序列化处理之经验积累(3) -- ObjectStateFormatter
- 数据序列化处理之经验积累(3) -- ObjectStateFormatter
- 全网枢纽大数据传输项目经验积累
- 玩转Web之Json(三)-----easy ui怎么把前台显示的dataGird中的所有数据序列化为json,返回到后台并解析
- [原创]WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
- wcf 基础教程 契约 Contract 数据契约DataContract序列化前身 XmlSerializer xml序列化
- 分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据
- 玩转Web之Json(三)-----easy ui怎么把前台显示的dataGird中的所有数据序列化为json,返回到后台并解析
- WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
- 数据契约(DataContract)及序列化指定输出字段
- 分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据
- easy ui怎么把前台显示的dataGird中的所有数据序列化为json,返回到后台并解析
- 收集积累员工的技能数据和项目经验数据很重要
- SpringData JPA easyUI dataGrid数据显示的解决经验