C# 类的序列化和反序列化

System.Runtime.Serialization.SerializationException”类型的未经处理的异常在 mscorlib.dll 中发生 

 

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。(摘自百度百科)

   在很多通讯或者数据存储的过程中,都需要序列化和反序列化的过程。

 

  在C#中,如果想要进行自定义类的序列化,只需要简单地在定义类的时候添加Serializable标签即可。如:

1

2

3

4

5

6

[Serializable]

public class Person

{

    public string name;

    public int age;

}

  经常用到的序列化方式有两种:二进制和XML,分为由System.Runtime.Serialization.Formatters.Binary.BinaryFormatter和System.Xml.Serialization.XmlSerializer实现。

  BinaryFormatter进行序列化和反序列化的时候,不会关心实际类型。但是XmlSerializer需要。

  

  自己写的一个简单的序列化辅助类

  

复制代码

    public static class SerializeHelper
    {
        /// <summary>
        /// 使用UTF8编码将byte数组转成字符串
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static string ConvertToString(byte[] data)
        {
            return Encoding.UTF8.GetString(data , 0 , data.Length);
        }

        /// <summary>
        /// 使用指定字符编码将byte数组转成字符串
        /// </summary>
        /// <param name="data"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static string ConvertToString(byte[] data , Encoding encoding)
        {
            return encoding.GetString(data , 0 , data.Length);
        }

        /// <summary>
        /// 使用UTF8编码将字符串转成byte数组
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static byte[] ConvertToByte(string str)
        {
            return Encoding.UTF8.GetBytes(str);
        }

        /// <summary>
        /// 使用指定字符编码将字符串转成byte数组
        /// </summary>
        /// <param name="str"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static byte[] ConvertToByte(string str , Encoding encoding)
        {
            return encoding.GetBytes(str);
        }

        /// <summary>
        /// 将对象序列化为二进制数据 
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static byte[] SerializeToBinary(object obj)
        {
            MemoryStream stream = new MemoryStream( );
            BinaryFormatter bf = new BinaryFormatter( );
            bf.Serialize(stream , obj);

            byte[] data = stream.ToArray( );
            stream.Close( );

            return data;
        }

        /// <summary>
        /// 将对象序列化为XML数据
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static byte[] SerializeToXml(object obj)
        {
            MemoryStream stream = new MemoryStream( );
            XmlSerializer xs = new XmlSerializer(obj.GetType( ));
            xs.Serialize(stream , obj);

            byte[] data = stream.ToArray( );
            stream.Close( );

            return data;
        }

        /// <summary>
        /// 将二进制数据反序列化
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public static object DeserializeWithBinary(byte[] data)
        {
            MemoryStream stream = new MemoryStream( );
            stream.Write(data , 0 , data.Length);
            stream.Position = 0;
            BinaryFormatter bf = new BinaryFormatter( );
            object obj = bf.Deserialize(stream);

            stream.Close( );

            return obj;
        }

        /// <summary>
        /// 将二进制数据反序列化为指定类型对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="data"></param>
        /// <returns></returns>
        public static T DeserializeWithBinary<T>(byte[] data)
        {
            return (T)DeserializeWithBinary(data);
        }

        /// <summary>
        /// 将XML数据反序列化为指定类型对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="data"></param>
        /// <returns></returns>
        public static T DeserializeWithXml<T>(byte[] data)
        {
            MemoryStream stream = new MemoryStream( );
            stream.Write(data , 0 , data.Length);
            stream.Position = 0;
            XmlSerializer xs = new XmlSerializer(typeof(T));
            object obj = xs.Deserialize(stream);

            stream.Close( );

            return (T)obj;
        }
    }
C#中的序列化反序列化是.NET运行时环境用来支持用户定义类型的流化的机制。序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候再把介质中的东西还原对象。在进行这些操作的时候都需要这个可以被序列化,要能被序列化,就得给头加[Serializable]特性。下面是C#序列化反序列化的方法: 1.使用BinaryFormatter进行序列化反序列化,BinaryFormatter是.NET Framework中的一个,它可以将对象序列化为二进制流,也可以将二进制流反序列化为对象。 ```csharp //序列化 using System.IO; using System.Runtime.Serialization.Formatters.Binary; public static void SerializeObject(string filename, object obj) { BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream(filename, FileMode.Create)) { formatter.Serialize(stream, obj); } } //反序列化 public static object DeserializeObject(string filename) { BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream(filename, FileMode.Open)) { return formatter.Deserialize(stream); } } ``` 2.使用DataContractSerializer进行序列化反序列化,DataContractSerializer是.NET Framework中的一个,它可以将对象序列化为XML格式,也可以将XML格式反序列化为对象。 ```csharp //序列化 using System.IO; using System.Runtime.Serialization; using System.Xml; public static void SerializeObject(string filename, object obj) { DataContractSerializer serializer = new DataContractSerializer(obj.GetType()); using (XmlWriter writer = XmlWriter.Create(filename)) { serializer.WriteObject(writer, obj); } } //反序列化 public static object DeserializeObject(string filename, Type type) { DataContractSerializer serializer = new DataContractSerializer(type); using (XmlReader reader = XmlReader.Create(filename)) { return serializer.ReadObject(reader); } } ``` 3.使用Json.NET进行序列化反序列化,Json.NET是一个流行的第三方JSON库,它可以将对象序列化为JSON格式,也可以将JSON格式反序列化为对象。 ```csharp //序列化 using Newtonsoft.Json; public static void SerializeObject(string filename, object obj) { string json = JsonConvert.SerializeObject(obj); File.WriteAllText(filename, json); } //反序列化 public static object DeserializeObject(string filename, Type type) { string json = File.ReadAllText(filename); return JsonConvert.DeserializeObject(json, type); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值