在当今这个快速、互联的世界中,无论是针对PC用户还是无线市场,数据序列化都应该是软件策略中不可或缺的一部分。为了从中获得最大的利益,需要知道如何最大化其效果。要做到这一点,需要了解并具备使用适合存储或传输需求的序列化类型的能力。
维基百科对序列化的定义是:“在计算机科学中,特别是在数据存储和传输的背景下,序列化是将数据结构或对象状态转换为可以存储(例如,在文件或内存缓冲区中)或传输(例如,通过网络连接)的格式,并在稍后在相同或不同的计算机环境中“复活”的过程。”
本文将展示在.NET环境中如何有效地利用现代电子商务事务中数据存储和传输的三大主要类型的序列化。
JSON(JavaScript对象表示法)是一种轻量级的数据交换格式。它基于JavaScript编程语言的一个子集,使其特别适合于Web编程或与HTTP协议相关的任何数据交换。
如果序列化对象不会通过网络传输,而是保存在磁盘上,这种格式化程序是序列化.NET框架应用程序特定对象的卓越选择。
XML可以用来存储任何类型的数据,如图片、音乐、二进制文件和数据库信息。它是一种标准化的、基于文本的文档格式,用于存储应用程序可读的信息,即使远程计算机不使用.NET框架,也可以在计算机之间传输对象。
能够在这三种类型的序列化之间切换,可以帮助编写能够应对当今市场需求的灵活应用程序。
本项目的主要对象是:
该接口允许从对象切换到对象,并为不同类型的序列化格式化程序暴露合同。
public interface IFomate
{
string Seryalize<T>(T obj);
string Seryalize(object obj);
byte[] Seryalize(object obj, Type T);
T Deseryalize<T>(string konteni);
}
对于这种序列化,使用CodePlex上的Newtonsoft库。
public class JsonFomate : IFomate
{
public JsonFomate(){}
public string Seryalize<T>(T obj)
{
string res = JsonConvert.SerializeObject(obj).FromJsonDateString();
return Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(res));
}
public string Seryalize(object obj)
{
string res = JsonConvert.SerializeObject(obj).FromJsonDateString();
return Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(res));
}
public byte[] Seryalize(object obj, Type t)
{
string res = JsonConvert.SerializeObject(obj).FromJsonDateString();
return Encoding.UTF8.GetBytes(res);
}
public T Deseryalize<T>(string konteni)
{
string res = konteni.ToJsonDateString();
return JsonConvert.DeserializeObject<T>(res);
}
}
public sealed class XmlFomate : IFomate
{
public XmlFomate(){}
public string Seryalize<T>(T obj)
{
MemoryStream ms = new MemoryStream();
XmlSerializer xml = new XmlSerializer(typeof(T));
xml.Serialize(ms, obj);
return Encoding.UTF8.GetString(ms.GetBuffer());
}
public string Seryalize(object obj)
{
MemoryStream ms = new MemoryStream();
XmlSerializer xml = new XmlSerializer(obj.GetType());
xml.Serialize(ms, obj);
return Encoding.UTF8.GetString(ms.GetBuffer());
}
public byte[] Seryalize(object obj, Type T)
{
MemoryStream ms = new MemoryStream();
XmlSerializer xml = new XmlSerializer(T);
return Encoding.UTF8.GetBytes(Encoding.Default.GetString(ms.GetBuffer()));
}
public T Deseryalize<T>(string konteni)
{
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(konteni));
XmlSerializer xml = new XmlSerializer(typeof(T));
return (T)xml.Deserialize(ms);
}
}
对于二进制序列化,使用BinaryFormatter类,这与XmlFomate类中的XmlSerializer不同。
public sealed class BinFomate : IFomate
{
public BinFomate(){}
public string Seryalize<t>(T obj)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bin = new BinaryFormatter();
bin.Serialize(ms, obj);
return Encoding.Unicode.GetString(ms.GetBuffer());
}
public string Seryalize(object obj)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bin = new BinaryFormatter();
bin.Serialize(ms, obj);
return Encoding.Unicode.GetString(ms.GetBuffer());
}
public byte[] Seryalize(object obj, Type T)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bin = new BinaryFormatter();
bin.Serialize(ms, obj);
return Encoding.Unicode.GetBytes(Encoding.Unicode.GetString(ms.GetBuffer()));
}
public T Deseryalize<t>(string konteni)
{
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(konteni));
BinaryFormatter bin = new BinaryFormatter();
return (T)bin.Deserialize(ms);
}
}
这是一个帮助类,用于JSON序列化中的日期格式化。
public static class DatZouti
{
public static string FromJsonDateString(this string konteni)
{
string eksp = @"\\/Date\((\d+)([\+\d]+)?\)\\/";
Match m = Regex.Match(konteni, eksp);
if (m.Success)
{
string vale = string.Empty;
string ts = m.Groups[1].Value.ToString();
DateTime dt = new DateTime(1970, 1, 1);
dt = dt.AddMilliseconds(long.Parse(ts)).ToLocalTime();
vale = Regex.Replace(konteni, eksp, dt.ToString("yyyy-MM-dd HH:mm:ss"));
if (!string.IsNullOrEmpty(vale))
return vale;
}
return konteni;
}
public static string ToJsonDateString(this string konteni)
{
string eksp = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
Match m = new Regex(eksp).Match(konteni);
if (m.Success)
{
string vale = string.Empty;
DateTime dt = DateTime.Parse(m.Value).ToUniversalTime();
TimeSpan ts = dt - DateTime.Parse("1970-01-01");
vale = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds);
konteni = Regex.Replace(konteni, eksp, vale);
}
return konteni;
}
}