数据序列化之经验积累(2) -- Datacontract formatter
来源:互联网 发布:php源码 编辑:程序博客网 时间:2024/06/05 21:53
此文中的序列化类,主要是利用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标注,否则基本是一样的。
- 数据序列化之经验积累(2) -- Datacontract formatter
- 数据序列化处理之经验积累(2) -- Datacontract formatter
- 数据序列化处理之经验积累(1)-BinaryFormatter
- 数据序列化处理之经验积累(3) -- ObjectStateFormatter
- 数据序列化处理之经验积累(1)-BinaryFormatter
- 数据序列化处理之经验积累(3) -- ObjectStateFormatter
- 数据契约(DataContract)
- 数据契约(DataContract)
- 数据契约(DataContract)
- 数据契约(DataContract)
- 数据契约(DataContract)
- DataContract 序列化 —— 如何序列化DataContract集合体
- WCF数据契约(DataContract)
- C# Attribute(特性)之---数据契约 [DataContract]
- 数据契约(DataContract)和DataMember
- 数据契约(DataContract)DataMember 用法
- 玩转树莓派之经验积累
- 数据契约[DataContract]
- Qt and environment variables passed to main
- edit form 里的数字验证2
- 读取资源文件的N种方法
- json中文乱码
- 数据序列化处理之经验积累(1)-BinaryFormatter
- 数据序列化之经验积累(2) -- Datacontract formatter
- 数据序列化处理之经验积累(3) -- ObjectStateFormatter
- Android HAL实现的三种方式(2) - 基于Service的HAL设计
- 解决曾经让我郁闷的一个问题
- Android HAL实现的三种方式(3) - 基于Manager的HAL设计
- Setforegroundwindow 将窗口置最前
- 网站备案猛于虎也
- MFC框架各部分指针获取方式
- PCB设计铜箔厚度、线宽和电流关系