简述dotnet序列化和反序列化
同java类比,dotnet也需要对某个对象进行持久化处理,从而在任何时间都能够恢复这个对象。为什么要使用序列化?因为我们需要将重要的对象存入到媒体,这个媒体可能是数据库或者是文件,或者我们需要将对象进行网络传输传递到另一个服务上,而这个对象转媒体(数据库、文件、网络传输流)的过程就是序列化的过程,反序列化则正好相反。
一个简单序列化的例子
微软官方文档给出了内置库中可以序列化的类型列表,见这里。先来声明一个实体类。在java中,序列化和反序列化需要实现Serializable接口,在dotnet中则是使用的方式进行标记Serializable。
讯享网你也可以指定表示不能被序列化的字段。接下来我们构建一个MyObject对象并对其序列化和反序列化。
讯享网
输出结果为:
可以看到对象除了被标记不能被序列化的字段以外全部恢复到了原来的值。查看生成的bin文件,发现序列化之后的数据采用开头

Formatter
在序列化的时候我们引入了一个BinaryFormatter类,这个类表示使用二进制的形式进行序列化,而在dotnet中有很多其他的formatter类,每一个formatter都对应了一种序列化的格式,列举几个:
- BinaryFormatter 用于二进制格式
- SoapFormatter 用于序列化soap格式
- LosFormatter 用于序列化 Web 窗体页的视图状态
- ObjectStateFormatter 用于序列化状态对象图
当然还有一些其他格式的序列化类,比如XmlSerializer、JsonSerializer等用于生成xml、json格式的数据,这个以后再说。
这些formatter类都实现了名为IFormatter、IRemotingFormatter的接口,其中IRemotingFormatter是用来远程调用的RPC接口,它也实现了IFormatter,所以重点看IFormatter接口。
孤傲苍狼java基础
IFormatter定义了序列化和反序列化的两个方法,以及三个字段,其中每个字段含义如下:
BinaryFormatter序列化的生命周期和事件
- 首先确定formatter是否有代理选择器,如果有则检查代理选择器要处理的对象类型是否和给定的对象类型一致,如果一致,代理选择器会调用。
- 如果没有代理选择器,或者代理选择器不处理该对象类型,则检查对象是否有特性。如果不能序列化则抛出异常。

- 检查该对象是否实现ISerializable接口,如果实现就调用其GetObjectData方法。
- 如果没实现ISerializable接口就使用默认的序列化策略,序列化所以没标记的字段。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/2327.html