【.NET】编程备忘:.Net中的各种序列化

我们知道将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本这正是数据持久化索要做的。而且,不同应用程序之间的通讯需要相互传输数据。那么序列化和反序列化正是为此而生。

序列化和反序列化

所谓序列化就是把对象转换为字节序列的过程称为对象的序列化。

所谓反序列化就是字节序列恢复为对象的过程称为对象的反序列化

那么.net开发中都为我们提供了哪些序列化和反序列化的方式呢?我简单总结了一下,有以下几种:

1.位于System.Xml.Serialization命名空间下的XmlSerializer

2.位于System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter

3.位于System.Runtime.Serialization.Formatters.Binary;命名空间下的BinaryFormatter

4.位于System.Web.Script.Serialization命名空间下的JavaScriptSerializer

5.位于System.Runtime.Serialization.Json命名空间下的DataContractJsonSerializer、DataContractSerializer

4.位于System.Xml.Serialization命名空间下的NetDataContractSerializer

5.来自第三方的Newtonsoft.Json

那么我简单地写了个序列化帮助类。完整代码如下(它们都有各自的使用场合,用法也不止如此):

namespace Serialization
{
    using System.IO;
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Runtime.Serialization.Formatters.Soap;
    using System.Runtime.Serialization.Json;
    using System.Text;
    using System.Web.Script.Serialization;
    using System.Xml.Serialization;
    using Newtonsoft.Json;
    public class SerializeHelper
    {
        #region XmlSerializer
        public static void XmlSerialize(string fileName, object obj)
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Write))
            {
                try
                {
                    XmlSerializer serializer = new XmlSerializer(obj.GetType());
                    serializer.Serialize(fs, obj);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }

        public static T XmlDeSerialize<T>(string fileName) where T : class,new()
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                try
                {
                    XmlSerializer serializer = new XmlSerializer(typeof(T));
                    return serializer.Deserialize(fs) as T;
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        #endregion

        #region SoapFormatter
        //不支持泛型 所序列化的类型必须标志为Serializable
        public static void SoapSerialize(string fileName, object obj)
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Write))
            {
                try
                {
                    SoapFormatter formatter = new SoapFormatter();
                    formatter.Serialize(fs, obj);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }

        public static T SoapDeSerialize<T>(string fileName) where T : class, new()
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                try
                {
                    SoapFormatter formatter = new SoapFormatter();
                    return formatter.Deserialize(fs) as T;
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        #endregion

        #region BinaryFormatter
        //所序列化的类型必须标志为Serializable
        public static void BinarySerialize(string fileName, object obj)
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Write))
            {
                try
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    formatter.Serialize(fs, obj);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }

        public static T BinaryDeSerialize<T>(string fileName) where T : class, new()
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                try
                {
                    BinaryFormatter formatter = new BinaryFormatter();
                    return formatter.Deserialize(fs) as T;
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        #endregion

        #region JavaScriptSerializer
        public static string JavaScriptSerialize(object obj)
        {
            JavaScriptSerializer serizlizer = new JavaScriptSerializer();
            return serizlizer.Serialize(obj);
        }

        public static T JavaScriptDeSerialize<T>(string json) where T : class, new()
        {
            JavaScriptSerializer serizlizer = new JavaScriptSerializer();
            return serizlizer.Deserialize<T>(json);
        }
        #endregion

        #region DataContractJsonSerializer
        /// <summary>
        /// (DataContractJsonSerialize)序列化
        /// </summary>
        /// <param name="item">对象</param>
        public static string DataContractJsonSerialize(object obj)
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
            using (MemoryStream ms = new MemoryStream())
            {
                serializer.WriteObject(ms, obj);
                return Encoding.UTF8.GetString(ms.ToArray());
            }
        }

        /// <summary>
        /// (DataContractJsonSerialize)反序列化
        /// </summary>
        /// <param name="str">字符串序列</param>
        public static T DataContractJsonDeSerialize<T>(string str) where T : class,new()
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(str)))
            {
                return serializer.ReadObject(ms) as T;
            }
        }
        #endregion

        #region NetDataContractSerializer
        public static void NetDataContractSerialize(string fileName, object obj)
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Write))
            {
                try
                {
                    NetDataContractSerializer serializer = new NetDataContractSerializer();
                    serializer.Serialize(fs, obj);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }

        public static T NetDataContractDeSerialize<T>(string fileName) where T : class,new()
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                try
                {
                    NetDataContractSerializer serializer = new NetDataContractSerializer();
                    return serializer.Deserialize(fs) as T;
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        #endregion

        #region DataContractSerializer
        public static void DataContractSerialize(string fileName, object obj)
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Write))
            {
                try
                {
                    DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
                    serializer.WriteObject(fs, obj);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }

        public static T DataContractDeSerialize<T>(string fileName) where T : class,new()
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                try
                {
                    DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                    return serializer.ReadObject(fs) as T;
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }
        #endregion

        #region Newtonsoft
        public static string JsonConvertSerialize(object item)
        {
            return JsonConvert.SerializeObject(item);
        }

        public static T JsonDeSerialize<T>(string json) where T : class,new()
        {
            return JsonConvert.DeserializeObject<T>(json);
        }
        #endregion
    }
}

关于各种序列化的各自"用武之地"以及总体性能比较,有空再细细深究。

【.NET】编程备忘:.Net中的各种序列化

时间: 2024-08-03 03:17:11

【.NET】编程备忘:.Net中的各种序列化的相关文章

【ASP.NET】编程备忘:页面传值之returnValue

在ASP.NET页面间传值的方式有很多,大致归为URL传值.内置对象传值这两类.当然宽泛地讲大致有这么些: Form表单传值:GET.POST(QueryString.PostBackUrl) 内置对象:Cookie.Session.Application.Cache.Response.Redirect.Server.Transfer Context 隐藏域 静态变量 文件:web.config.Machine.config...... 注:严格地说文件并不能说成是页面间传值的一种方式.它和数据

备忘之类中的static成员的访问方式

原文地址:http://leihuang.net/2014/05/19/List-Interviews/ 单链表的一些常见面试题汇总 单链表反转/逆序 求单链表倒数第N个数 找到单链表的中间结点 如何判断链表是否有环的存在 单链表建环,无环链表变有环 如何知道环的长度? 如何找出环的连接点在哪里? 删除单链表中的重复元素 下面我先简单叙述一下每道题的思路,然后把实现的程序一起贴出来,不会讲得太细,我觉得只要有了思路之后,接下来的难点就是语言上的一些细节问题了,这个不自己去实现,听别人讲是体会不到

备忘: Android中把EditText的输入内容转为大写

editText_SerialCode = (EditText) findViewById(R.id.editText_SerialCode); editText_SerialCode.addTextChangedListener(textWatcher); private TextWatcher textWatcher = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int

[转载]unix环境高级编程备忘:理解保存的设置用户ID,设置用户ID位,有效用户ID,实际用户ID

转载自http://www.cnblogs.com/stemon/p/5287631.html 一.基本概念 实际用户ID(RUID):用于标识一个系统中用户是谁,一般是在登录之后,就被唯一的确定,就是登录的用户的uid. 有效用户ID(EUID):用于系统决定用户对系统资源的权限,也就是说当用户做任何一个操作时,最终看它有没有权限,都是在判断有效用户ID是否有权限.如果有,则ok,否则报错不能执行.在正常的情况下,一个用户登录之后(假设是A用户),A用户的有效用户ID和实际用户ID是相同的,但

[备忘]WCF中使用MessageContract的一些注意点

准备使用WCF完成上传文件,以取代之前HTTP POST的方式. 但是调试了很久一直报错,后来经过一些修改终于通过,以下是一些可能需要注意的地方: 1.在WCF服务的OperatorContract 方法中,只能包含一个MessageContract参数(猜测) 2.包含MessageContract参数的这个方法,不能有string之类返回值,只能返回void(确定)

android 蓝牙通讯编程 备忘

1.启动App后: 判断->蓝牙是否打开(所有功能必须在打牙打开的情况下才能用) 已打开: 启动代码中的蓝牙通讯Service 未打开: 发布 打开蓝牙意图(系统),根据Activity返回进场操作 打开成功,启动代码中的蓝牙通讯Service 用户点back或失败 退出App 2.蓝牙设备列表: 2.1显示已经配对列表: 注册蓝牙设备发现广播 广播中将发现的设备添加到列表2.2当用户点Scan时,启动蓝牙发现,发现设备时会收到广播事件. 2.3用户点某个条目时,将改条目的 MAC返回给主Act

项目中oracle存储过程记录——常用语法备忘

项目中oracle存储过程记录--常用语法备忘 项目中需要写一个oracle存储过程,需求是收集一个复杂查询的内容(涉及到多张表),然后把符合条件的记录插入到目标表中.其中原表之一的日期字段是timestamp类型,目标表的字段是varchar2类型: 其中一些内容很常用,所以做下记录,供查找. 1.存储过程的格式 oracle存储过程和函数都可以实现,一般没有返回值,则采用存储过程,函数比sqlserver的功能强大.oracle变量定义最好加上前缀如V_,查询条件中变量名称和字段名称不能重复

VS2008 Lua 编程环境搭建(初学备忘)

在VS 2008 中,导入 lua.h 之类的头文件后,编译含有Lua函数的时候,可能会出现如下错误: 1>main.obj : error LNK2019: 无法解析的外部符号_luaL_checkinteger,该符号在函数"int __cdecl add(struct lua_State *)" ([email protected]@[email protected]@@Z) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号_lua

备忘3:数据绑定中值的判断

昨天,在一个项目中,要用到Repeater循环获取值,然后根据某个字段的值进行判断,以决定是否需要添加某个样式.之前用的<%#Eval("Name").ToString()==name?"是":"否”%>,其中name为.cs页面一个公共string类型的变量,Name为数据库里表的一个nvarchar(50)类型的字段.通过调试发现数据源中的数据其实是和name的值相等的,但是判断的值一直是"否".后来,百度找到的方案是改