2024年孤傲苍狼java基础

孤傲苍狼java基础简述 dotnet 序列化和反序列化 同 java 类比 dotnet 也需要对某个对象进行持久化处理 从而在任何时间都能够恢复这个对象 为什么要使用序列化 因为我们需要将重要的对象存入到媒体 这个媒体可能是数据库或者是文件 或者我们需要将对象进行网络传输传递到另一个服务上 而这个对象转媒体 数据库 文件 网络传输流 的过程就是序列化的过程 反序列化则正好相反 一个简单序列化的例子

大家好,我是讯享网,很高兴认识大家。



简述dotnet序列化和反序列化

同java类比,dotnet也需要对某个对象进行持久化处理,从而在任何时间都能够恢复这个对象。为什么要使用序列化?因为我们需要将重要的对象存入到媒体,这个媒体可能是数据库或者是文件,或者我们需要将对象进行网络传输传递到另一个服务上,而这个对象转媒体(数据库、文件、网络传输流)的过程就是序列化的过程,反序列化则正好相反。

一个简单序列化的例子

微软官方文档给出了内置库中可以序列化的类型列表,见这里。先来声明一个实体类。在java中,序列化和反序列化需要实现Serializable接口,在dotnet中则是使用的方式进行标记Serializable。

 
讯享网 

你也可以指定表示不能被序列化的字段。接下来我们构建一个MyObject对象并对其序列化和反序列化。

讯享网

输出结果为:

 

可以看到对象除了被标记不能被序列化的字段以外全部恢复到了原来的值。查看生成的bin文件,发现序列化之后的数据采用开头

Formatter

在序列化的时候我们引入了一个BinaryFormatter类,这个类表示使用二进制的形式进行序列化,而在dotnet中有很多其他的formatter类,每一个formatter都对应了一种序列化的格式,列举几个:

  1. BinaryFormatter 用于二进制格式
  2. SoapFormatter 用于序列化soap格式
  3. LosFormatter 用于序列化 Web 窗体页的视图状态
  4. ObjectStateFormatter 用于序列化状态对象图

当然还有一些其他格式的序列化类,比如XmlSerializer、JsonSerializer等用于生成xml、json格式的数据,这个以后再说。

这些formatter类都实现了名为IFormatter、IRemotingFormatter的接口,其中IRemotingFormatter是用来远程调用的RPC接口,它也实现了IFormatter,所以重点看IFormatter接口。

孤傲苍狼java基础

IFormatter定义了序列化和反序列化的两个方法,以及三个字段,其中每个字段含义如下:

类 字段名

含义用途

ISurrogateSelector SurrogateSelector

序列化代理选择器 接管formatter的序列化或反序列化处理

SerializationBinder Binder

用于控制在序列化和反序列化期间使用的实际类型

StreamingContext Context

序列化流上下文 其中states字段包含了序列化的来源和目的地

BinaryFormatter序列化的生命周期和事件

  1. 首先确定formatter是否有代理选择器,如果有则检查代理选择器要处理的对象类型是否和给定的对象类型一致,如果一致,代理选择器会调用。
  2. 如果没有代理选择器,或者代理选择器不处理该对象类型,则检查对象是否有特性。如果不能序列化则抛出异常。

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

特性

调用关联的方法时

典型用法

OnDeserializingAttribute

反序列化之前

初始化可选字段的默认值。

OnDeserializedAttribute

反序列化之后

根据其他字段的内容修改可选字段值。

OnSerializingAttribute

序列化之前

准备序列化。 例如,创建可选数据结构。

OnSerializedAttribute

序列化之后

记录序列化事件。

img src="https://lmboke.com/upload/640-mptm.png" width="100%" height="100%" style="display: inline-block">

img src="https://lmboke.com/upload/3-rkbg.png" width="100%" height="100%" style="display: inline-block">

ysoserial.net

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本平台和发布者不为此承担任何责任。

小讯
上一篇 2024-12-30 18:46
下一篇 2024-12-25 12:37

相关推荐

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