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);
}
}