c#序列化

xml序列化;javascript序列化;二进制序列化

序列化,就是把一个对象转换成另外一种格式的过程,转换成不同的格式就叫做不同的序列化,比如xml格式,叫做xml序列化。JavaScript的json格式,叫做JavaScript序列化。转换成二进制byte[]字节,叫做二进制序列化。

序列化只序列化对象属性(或者说是序列化了对象中的状态信息(字段、属性就是用来存储状态的)),而方法并没有序列化。

序列化后的目的,是为了把数据以另外一种格式来表示,方便存储与交换数据,所以序列化只序列化那些存储数据的成员,一般就是属性,不会序列化方法的。

1、二进制序列化 (利用BinaryFormatter类)

//二进制序列化 (必须添加 [Serializable]特性用于标记。object,int等类型都已经添加此特性了)

List list = new List() { "上海", "中国", "西安" };
BinaryFormatter bf = new BinaryFormatter();
using (FileStream fsWrite = File.OpenWrite("list.bin")) 
{
 bf.Serialize(fsWrite, list);//将list对象序列化到文件流中
 //bf.Deserialize();//反序列化
}

  

 //二进制序列化要求:

//1.被序列化的对象的类型必须标记为可序列化的。
//2.二进制序列化会把属性对应的字段序列化到文件中,所以最好类型中不要使用自动属性(编译器会自动生成字段),而要自己写属性与字段
//3.当序列化一个对象的时候,这个对象本身以及所有父类都必须标记为可序列化的。
//4.类型中所有属性与字段的类型必须也标记为可序列化的。接口不需要。
//5.通过[NonSerialized]把某个字段标记为不可序列化的。

 

//二进制反序列化(必须添加对象类型的引用)

//反序列化的时候,需要创建原来被序列化的类型的对象,所以反序列化的时候需要引用被序列化的类型的对象。正是因为如此,所以在二进制序列化的时候,那些属性名、方法等根本不需要序列化,只需要把那些状态信息(数据→字段的值)序列化了就好了,对于那些方法等信息,在反序列化时,创建对象的时候会自动创建,然后根据序列化文件中的字段的值,进行赋值。这就是反序列化。

BinaryFormatter bf = new BinaryFormatter();
using (FileStream fsRead = File.OpenRead("words.bin"))
{
object obj = bf.Deserialize(fsRead);
List<string> list = obj as List<string>;
foreach (var item in list)
{
Console.WriteLine(item);
}
}

2、xml序列化 (xmlSerializer)

XmlSerializer xmlSerializer = new XmlSerializer(list.GetType());
XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Person>));
using (FileStream fsWrite = File.OpenWrite("list.xml"))
{
xmlSerializer.Serialize(fsWrite, list);
 //xmlSerializer.Deserialize();//反序列化
}

3、使用JavaScript 序列化。(JavaScriptSerializer )

JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
string str = jsSerializer.Serialize(list);
//jsSerializer.Deserialize();//反序列化
File.WriteAllText("list.txt", str);

补充:二进制序列化例子

            Person person = new Person();
            person.Name = "张三";
            person.Age = 19;
            person.Email = "zhangsan@yahoo.com";
            person.MyCar = new Car() { Brand = "时风" };

            //二进制序列化步骤:
            //1.创建二进制序列化器
            BinaryFormatter bf = new BinaryFormatter();
            //我们希望将对象序列化到一个文件上,所以要创建一个文件流
            using (FileStream fsWrite = File.OpenWrite("person.bin"))
            {
                //开始执行二进制序列化
                bf.Serialize(fsWrite, person);
            }
            Console.WriteLine("序列化完毕!");
            Console.ReadKey();

  自定义类

    [Serializable]
    public class Car
    {
        private string _brand;
        public string Brand
        {
            get { return _brand; }
            set { _brand = value; }
        }
    }
    [Serializable]
    public class Animal
    {
    }
    [Serializable] //特性,当为某个类加了该特性后,这个类就标记为了可序列化的了。
    public class Person : Animal
    {
        private Car _myCar;
        public Car MyCar
        {
            get { return _myCar; }
            set { _myCar = value; }
        }
        //[NonSerialized]//当前这个字段就不会被序列化了。
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        //[NonSerialized]
        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
        //[NonSerialized]
        private string _email;
        public string Email
        {
            get { return _email; }
            set { _email = value; }
        }
        private string _gender = "男";
        public int _height = 180;
        public void SayHi()
        {
            Console.WriteLine("大家好,我叫:{0}", Name);
        }
        public void SayHello()
        {
            Console.WriteLine("Hello");
        }
    }

  

posted on 2015-10-26 09:54  crhdyl  阅读(170)  评论(0编辑  收藏  举报

导航