在实现反序列化的时候,上个DEMO直接将SQLconnection对象的创建写在了product的构造函数中,而在序列化时,再通过实现IDeserializationCallback接口重新创建SqlConnection对象,以此来还原对象状态。在Product构造函数和OnDeserialization()方法中,都硬编码了数据库连接字符串。
而更常见的情况时将SqlConnection的连接字符串保存在变量中:
如图:
序列化之后:
很多时候,数据库连接字符串属于敏感数据,我们并不希望它出现在序列化的文件中。
解决这个问题的一个办法是将连接字符串也标记为[NonSerialized],不过这样反序列化后对象的状态就不完整了。
方法二:
在序列化前将字符串进行加密,在反序列化后,对加密过的字符串进行还原。换言之,就是在序列化/反序列化的过程中注入一定的逻辑。
.NET提供了四个序列化,反序列化的特性标记来实现这一过程:
类中的写法如下:
调用的时候:
结果如下,序列化和反序列化一次执行方法如下:
调用后的结果与实现IDeserializationCallback接口的功能,可以看出,使用序列化的基本方法,还能保证序列化过程的安全性,因为对于这些特殊字符,我们可以在序列化过程中加入加密和解密算法,来保证信息不被非法窃取。