对象序列化

1、对象序列化是将对象(比如Person对象)转换为二进制数据,反序列化是将二进制数据还原为对象。对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。就像用DV录像(序列化)和用播放器播放(反序列化)一样序列化反序列化只针对非静态字段和属性。序列化的是对象,所以跟静态成员没有关系

2、BinaryFormatter类有两个方法:

(1)void Serialize(Stream stream, object graph) //对象graph序列化到stream中

(2)object Deserialize(Stream stream) //将对象从stream中反序列化,返回值为反序列化得到的对象。

 

3、练习:将几个int、字符串添加到ArrayList中,然后序列化到文件中,再反序列化回来。

4、不是所有对象都能序列化,只有可序列化的对象才能序列化在类声明上添加[Serializable],对象的属性、字段的类型也必须可序列化

5、反序列的项目中必须有同样的类,否则不能反序列化

6、Serialize 序列化:把一个对象存到中(可能是网络流,也可能是文件流,或者是内存流)。把对象放成一堆二进制数据。

7、序列化的应用: ASP.Net  ViewState、WCF、.Net Remoting、ASP.Net Cache 、集群等。扩展阅读:https://blog.csdn.net/qq_34573534/article/details/100567542

8、(面试题)深度拷贝。浅层拷贝。先手写浅层拷贝、深层拷贝的代码,理解了概念再谈用MemberwiseClone 、DeepCopy。

 class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.Name = "tom";
            p1.Age = 33;
            p1.dog = new Dog() { Name="祖德"};
            //Person p2 = p1;
            //Console.WriteLine(object.ReferenceEquals(p1,p2));
            Person p2 = new Person();
            p2.Age = p1.Age;
            p2.Name = p1.Name;
            //p2.dog = p1.dog;//浅层拷贝。对象是新的对象,对象的值类型重新拷贝,引用类型的字段、属性还是指向相同的对象。共狗。
            Dog dog2 = new Dog();
            dog2.Name = p1.dog.Name;
            p2.dog = dog2;//深层拷贝。对象是新的对象,对象的值类型重新拷贝,引用类型的字段、属性也指向对象的一份拷贝。

            Console.WriteLine(object.ReferenceEquals(p1.dog,p2.dog));
            Console.ReadKey();
        }
    }

    [Serializable]
    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public Dog dog { get; set; }//对象关联的对象的类也要可序列化。株连九族!
    }

    [Serializable]
    class Dog
    {
        public string Name { get; set; }
    }

9、写代码拷贝,实现ICloneable方法,内部调用MemberwiseClone

10、  参考资料https://blog.csdn.net/qq_34573534/article/details/100567741

 static object DeepCopy(object src)
        {
            BinaryFormatter Formatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
            using (MemoryStream stream = new MemoryStream())
            {
                Formatter.Serialize(stream, src);
                stream.Position = 0;
                return Formatter.Deserialize(stream);
            }
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值