65.9K
CodeProject 正在变化。 阅读更多。
Home

无缝切换序列化

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (7投票s)

2012 年 6 月 12 日

CPOL

2分钟阅读

viewsIcon

26221

downloadIcon

283

在不同类型的序列化之间切换。

引言

序列化是现代、快节奏、互联世界为我们提供的大生意中不可或缺的一部分。无论您是面向 PC 用户还是无线市场,序列化都应该是您软件战略中不可或缺的一部分。为了从中获得最大的收益,您需要知道如何最大限度地提高其效率。实现这一目标的唯一方法是了解并具备使用最适合您的存储或传输要求的序列化的能力。

作为一般定义,维基百科将序列化定义为:“在计算机科学中,在数据存储和传输的上下文中,序列化是将数据结构或对象状态转换为可以存储(例如,在文件或内存缓冲区中,或通过网络连接链路传输)并稍后在相同或另一个计算机环境中“复活”的过程”。

背景

在本文中,我们将演示如何从 .Net 环境中有效地利用三种主要的序列化类型,这些类型代表了现代电子商务事务中数据存储和传输的基石。

  • JSON:JSON (JavaScript 对象表示法) 是一种轻量级的数据交换格式。它基于 JavaScript 编程语言的一个子集,这使得它特别适用于 Web 编程或与通过 HTTP 协议进行数据交换相关的任何事情。
  • 二进制序列化:如果您的序列化对象不会跨越网络,而是保存在磁盘上,那么这个格式器是您为 .NET Framework 应用程序序列化对象的最佳选择。
  • XML 序列化:XML 可用于存储任何类型的数据,例如图片、音乐、二进制文件和数据库信息。它是一种标准化的、基于文本的文档格式,用于存储应用程序可读信息,即使远程计算机未使用 .NET Framework,也可以在计算机之间传输对象。

能够在这三种类型的序列化之间切换可以帮助您编写灵活的应用程序,以响应当今市场的需求。

使用代码

该项目的主要对象是

  • LibSerialization.cs 包含三个类和一个接口。您可以直接将其放入您的 App_Code 文件夹中,或将其编译成 .dll 库。
  • 一个封装对象的 ASP.NET 页面示例。

该解决方案包括一个用于测试目的的 ASP.NET 示例。

IFomate 接口

它允许我们从一个对象切换到另一个对象,并公开不同类型的序列化格式器的契约。

public interface IFomate
{
    string Seryalize<T>(T obj);
    string Seryalize(object obj);
    byte[] Seryalize(object obj, Type T);
    T Deseryalize<T>(string konteni);
}

JsonFomate

对于这种序列化,我们使用 CodePlex 上的 Newtonsoft 库 CodePlex

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);
    }
}

XmlFomate 类

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);
        xml.Serialize(ms, obj);
        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);
    }
}

BinFomate 类

对于二进制序列化,我们使用 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);
    }
}

DataZouti 类

这是一个用于 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;
    }
}

关注点

您可以使用序列化的场景很多:例如数据库备份、数据结构验证和对象加密,仅举几例。

历史

InterSerialization v1.0。

© . All rights reserved.