代码改变世界

C# 数据的序列化存取

2014-11-22 14:58  wuzhang  阅读(3876)  评论(1编辑  收藏  举报

1,什么是序列化?

  序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Intranet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。

2.为什么使用序列化

a. 一个原因是将对象的状态保持在存储媒体中,以便可以在以后重新创建精确的副本。我们经常需要将对象的字段值保存到磁盘 中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可 以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。

b.另一个原因是通过值将对象从一个应用程序域发送到另一个应用程序域中。例如,序列化可用于在 ASP.NET 中保存会话状态并将对象复制到 Windows 窗体的剪贴板中。远程处理还可以使用序列化通过值将对象从一个应用程序域传递到另一个应用程序域中。

(序列化技术的主要两个目的是:持久化存储按值封送数据保护。)

3怎样进行序列化和反序列化?

a .XML序列化
添加System.Runtime.Serialization.Formatters.Binary命名空间;
b. 二进制序列化
添加System.Xml.Serialization命名空间;
NoSerialized属性被Xmllgnore属性替代;
c.soap序列化
典型应用:web service.

 

下面看一下二进制序列化:

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;

namespace serial1
{
    /// <summary>
    /// Person类的序列化
    /// </summary>
    [Serializable]
    public class Person
    {
        public string Sno { get; set; }
        public string Name { get; set; }
        public string Sex { get; set; }
        public int Age { get; set; }
        public string Other { get; set; }

        //非序列化的属性
        [NonSerialized]
        public string NoSerial;

        /// <summary>
        /// 成员函数
        /// </summary>
        /// <returns></returns>
        public string DisplayInfo()
        {
            return "我的学号是:" + Sno + "\n我的名字是:" + Name + "\n我的性别为:" + Sex + "\n我的年龄:" + Age + "\n非序列化:" + NoSerial+"\n";
        }
    }


    class Program
    {
        static void Main(string[] args)
        {

            //实例化两个对象
            var me = new Person
            {
                Sno = "1215115231",
                Name = "wuzhang",
                Sex = "man",
                Age = 22,
                NoSerial="不被序列化1",
                Other = "\n"

            };
            var he = new Person
            {
                Sno = "1215115250",
                Name = "wanggang",
                Sex = "man",
                Age = 21,
                NoSerial = "不被序列化2",
                Other = "\n"

            };
            List<Person> personInfo = new List<Person>();
            personInfo.Add(me);
            personInfo.Add(he);
            //创建一个格式化程序的实例
            IFormatter formatter = new BinaryFormatter();
            //创建一个文件流
            if (!File.Exists("F:\\TestTxt.txt"))
            {
                //FileStream fs1 = new FileStream("F:\\TestTxt.txt", FileMode.Create, FileAccess.Write);//创建写入文件 
                Stream stream = new FileStream("F:\\TestTxt.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
                foreach(Person per in personInfo)
                {
                    formatter.Serialize(stream, per);
                }
                stream.Close();
            }
            else
            {
                Stream stream = new FileStream("F:\\TestTxt.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
                foreach (Person per in personInfo)
                {
                    formatter.Serialize(stream, per);
                }
                stream.Close();

            }

           Stream destream = new FileStream("F:\\TestTxt.txt", FileMode.Open,
           FileAccess.Read, FileShare.Read);
           var stillme = (Person)formatter.Deserialize(destream);
           var stillme1 = (Person)formatter.Deserialize(destream);

           Console.WriteLine(stillme.DisplayInfo());
           Console.WriteLine(stillme1.DisplayInfo());

           destream.Close();

           Console.ReadLine();
        }
    }
}

 

 

 

运行结果:

 

其它两种方式就不再实验了,搞定!