ISerializable接口
继承ISerializable接口可以灵活控制序列化过程
格式化器的工作流程:格式化器再序列化一个对象的时候,发现对象继承了ISerializable接口,那它就会忽略掉类型所有的序列化特性,转而调用类型的GetObjectData方法来构造一个SerializationInfo对象。
我们在方法GetObjectData中处理序列化,然后在一个带参数的构造方法中处理反序列化。虽然在接口中没有地方指出需要这样一个构造器,但这确实是需要的,除非我们序列化后不再打算把它反序列化回来。
public interface ISerializable
{
[SecurityCritical]
void GetObjectData(SerializationInfo info, StreamingContext context);
}
[Serializable]
public class UserInfo : ISerializable
{
//public string FirstName { get; set; }
//public string LastName { get; set; }
public string Name { get; set; }
public UserInfo() { }
public UserInfo(SerializationInfo info, StreamingContext context) {
Name = info.GetString("Name");
//FirstName = info.GetString("FirstName");
//LastName = info.GetString("LastName");
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", this.Name);
if (!string.IsNullOrWhiteSpace(this.Name))
{
info.AddValue("FirstName", this.Name.Split(' ')[]);
info.AddValue("LastName", this.Name.Split(' ')[]);
} }
} public class UserInfoDTO
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Name { get; set; }
}
static void Main(string[] args)
{
UserInfo userInfo = new UserInfo { Name= "尼古拉斯 赵四" }; string seriaData = JsonConvert.SerializeObject(userInfo);//{"Name":"尼古拉斯 赵四","FirstName":"尼古拉斯","LastName":"赵四"}
UserInfoDTO userInfoDTO = JsonConvert.DeserializeObject<UserInfoDTO>(seriaData);
Console.ReadKey();
}
参考:https://www.cnblogs.com/farmer-y/p/7991961.html
ISerializable接口的更多相关文章
- 初识序列化和反序列化,使用BinaryFormatter类、ISerializable接口、XmlSerializer类进行序列化和反序列化
序列化是将对象转换成字节流的过程,反序列化是把字节流转换成对象的过程.对象一旦被序列化,就可以把对象状态保存到硬盘的某个位置,甚至还可以通过网络发送给另外一台机器上运行的进程.本篇主要包括: ● 使用 ...
- 编写高质量代码改善C#程序的157个建议——建议56:使用继承ISerializable接口更灵活地控制序列化过程
建议56:使用继承ISerializable接口更灵活地控制序列化过程 接口ISerializable的意义在于,如果特性Serializable,以及与其像配套的OnDeserializedAttr ...
- 【转】编写高质量代码改善C#程序的157个建议——建议56:使用继承ISerializable接口更灵活地控制序列化过程
建议56:使用继承ISerializable接口更灵活地控制序列化过程 接口ISerializable的意义在于,如果特性Serializable,以及与其像配套的OnDeserializedAttr ...
- 理解IEnumerator+IEnumerable这种接口思想
前言 本文不想过多篇幅来介绍IEnumerator和IEnumerable这两个接口的具体说明,只是把它作一个例子作引言而已,本文将根据自己的理解来描述微软为何要这样设计这种关联风格的接口.这种风格的 ...
- C# - 常用接口
常用接口 用于比较接口 IComparable<T> 接口内部定义了用于比较两个对象大小的CompareTo(T t)方法,>参数时返回1,=参数时返回0,<参数时返回-1.集 ...
- 编写高质量代码改善C#程序的157个建议——建议57:实现ISerializable的子类型应负责父类的序列化
建议57:实现ISerializable的子类型应负责父类的序列化 我们将要实现的继承自ISerializable的类型Employee有一个父类Person,假设Person没有实现序列化,而现在子 ...
- 踩坑记录--接口调用,传参DataTable报错
问题描述 服务端提供接口,接口参数包含DataTable类型,客户端调用显示请求报错,Postman调用显示Could not get response 解决 原因 接口实现基于wcf,而wcf参数类 ...
- Unity 序列化 总结
查找了 Script Serialization http://docs.unity3d.com/Manual/script-Serialization.html 自定义序列化及例子: http:// ...
- WebApi返回Json格式字符串
WebApi返回json格式字符串, 在网上能找到好几种方法, 其中有三种普遍的方法, 但是感觉都不怎么好. 先贴一下, 网上给的常用方法吧. 方法一:(改配置法) 找到Global.asax文件,在 ...
随机推荐
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) C. p-binary 水题
C. p-binary Vasya will fancy any number as long as it is an integer power of two. Petya, on the othe ...
- 【shell脚本】创建账户及删除账户,批量创建账户及批量删除账户===autoCreateUser.sh
一.字符串运算符 二.创建账户 1.提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码.如果用户不输入账户名,则提示必须输入账户名并退出脚本;如果用户不输入密码,则统一使用默认的 123456 ...
- 【Oracle】 RMAN命令汇总
RMAN命令汇总 2013年写了关于RMAN命令的汇总,先转换为MD文档,温故而知新. 1.进入RMAN 进入本地数据库 [oracle@oracle-n1 ~]$ rman target / 进入远 ...
- python 自定义Iterator对象
from collections.abc import Iterator class Company(object): def __init__(self, employee_list): self. ...
- Mongodb--内存管理MMAP
MongoDB使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP. MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内 ...
- Nuget包管理工具(程序包控制台执行语句)
NUGET命令 注:使用前确保nuget是最新版本,升级到最新版本有两种方式: (1).CMD将nuget升级到最新版本:nuget update -self (2).扩展中查看nuget是否需要更新 ...
- ArcGIS随机数生成
arcgis python 随机数 语法用法一例: //--------------------------------------------- //定义函数getnums 返回一个随机数(0,5 ...
- ASP.NET MVC 中的过滤器
这里用实例说明各种过滤器的用法,有不对的地方还请大神指出,共同探讨. 1. ActionFilter 方法过滤器: 接口名为 IActionFilter ,在控制器方法调用前/后执行. 在新建的MVC ...
- 前端移动框架Framework7入门
正版官网:https://framework7.io/ (英文) 对应国内:http://www.framework7.cn/ (中文) 本地构建步骤(Demo级别) 1.HTML结构 2.引入Fr ...
- Python - Socket网络编程 - 第二十六天
网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高 ...