当前位置:网站首页 > Java基础 > 正文

孤傲苍狼java基础



简述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字段包含了序列化的来源和目的地

/div>

/p>

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

/h2>

/p>

ol>

  • 首先确定formatter是否有代理选择器,如果有则检查代理选择器要处理的对象类型是否和给定的对象类型一致,如果一致,代理选择器会调用。
  • 如果没有代理选择器,或者代理选择器不处理该对象类型,则检查对象是否有特性。如果不能序列化则抛出异常。
  • 检查该对象是否实现ISerializable接口,如果实现就调用其GetObjectData方法。
  • 如果没实现ISerializable接口就使用默认的序列化策略,序列化所以没标记的字段。
  • /ol>

    /p>

    特性

    调用关联的方法时

    典型用法

    OnDeserializingAttribute

    反序列化之前

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

    OnDeserializedAttribute

    反序列化之后

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

    OnSerializingAttribute

    序列化之前

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

    OnSerializedAttribute

    序列化之后

    记录序列化事件。

    /div>

    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">

    strong>ysoserial.net

    /strong>

    strong>

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

    /strong>

  • 上一篇: java中的接口基础
  • 下一篇: 南昌java基础班
  • 版权声明


    相关文章:

  • java中的接口基础2024-11-07 16:34:00
  • 复合类型和基础类型java2024-11-07 16:34:00
  • 零基础学java script2024-11-07 16:34:00
  • java基础整型包装2024-11-07 16:34:00
  • java基础入门答案pdf2024-11-07 16:34:00
  • 南昌java基础班2024-11-07 16:34:00
  • java基础排序2024-11-07 16:34:00
  • 0基础学java**学习路径2024-11-07 16:34:00
  • java基础学生系统管理代码2024-11-07 16:34:00
  • Java的基础与新特性2024-11-07 16:34:00