c# 对序列化类XMLSerializer 二次封装泛型化方便了一些使用的步骤
原文作者:aircraft
原文链接:https://www.cnblogs.com/DOMLX/p/17270107.html
加工的泛型类如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Serialization; namespace Data
{
public class XMLSerializer<T>
{ public static bool Save(T obj, string flieName)
{
string dir = Path.GetDirectoryName(flieName);
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
try
{
if (flieName.Trim().Length == 0)
return false;
string strFolder = Path.GetDirectoryName(flieName); XmlSerializer xs = new XmlSerializer(typeof(T));
using (FileStream fs = new FileStream(flieName, FileMode.Create))
{
xs.Serialize(fs, obj);
//fs.Close ();
}
return true;
}
catch (Exception ex)
{
MessageBox.Show("序列化保存时出错,出错原因为:" + ex.ToString());
return false;
}
} public static T Load(string fileName)
{
if (File.Exists(fileName) == false)
{
return default(T);
} T obj = default(T);
try
{
XmlSerializer xml = new XmlSerializer(typeof(T)); using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
obj = (T)xml.Deserialize(fs);
//fs.Close ();
}
}
catch (Exception ex)
{
MessageBox.Show("序列化读取时出错,出错原因为:" + ex.ToString());
return default(T);
}
return obj;
} public static T Clone(T target)
{
T obj = default (T);
try
{
MemoryStream ms = new MemoryStream ();
XmlSerializer xml = new XmlSerializer (typeof (T));
xml.Serialize (ms, target);
ms.Seek (0, SeekOrigin.Begin);
obj = (T)xml.Deserialize (ms);
}
catch (Exception ex)
{
MessageBox.Show ("拷贝时出错,出错原因为:" + ex.ToString ());
return default (T);
}
return obj;
}
}
}
例如我们有个简单的类
class Apply
{
[CategoryAttribute("基本参数"), DisplayName("片数")]
public int WaferNum { get; set; } = 25;
[CategoryAttribute("基本参数"), DisplayName("文件原路径")]
public string OriFilePath { get; set; } = "D:\\Data"; }
需要去导入,保存,深拷贝复制,我们就可以这样调用
Apply apply = new Apply(); XMLSerializer<Apply>.Save(apply , "D:\\Appply.xml"); Apply apply = XMLSerializer<Apply>.Load( "D:\\Appply.xml"); //也可以作为类的复制快捷方式来使用--例如下面类这样
class App
{ int a = 0; public App Clone()
{
App a;
a = XMLSerializer<App>.Clone(this);
return a;
} }
若有兴趣交流分享技术,可关注本人公众号,里面会不定期的分享各种编程教程,和共享源码,诸如研究分享关于c/c++,python,前端,后端,opencv,halcon,opengl,机器学习深度学习之类有关于基础编程,图像处理和机器视觉开发的知识

c# 对序列化类XMLSerializer 二次封装泛型化方便了一些使用的步骤的更多相关文章
- drf序列化高级、自定义只读只写、序列化覆盖字段、二次封装Response、数据库查询优化(断关联)、十大接口、视图家族
目录 自定义只读 自定义只写 序列化覆盖字段 二次封装Response 数据库关系分析 断外键关联关系 ORM操作外键关系 ORM四种关联关系 基表 系列化类其他配置(了解) 十大接口 BaseSer ...
- APP自动化针对PO模式进行二次封装之basepage
APP自动化跟WEB自动化所使用的框架基本一样,都是采用的PO模式结合pytest框架编写自动化测试脚本,为了提高代码的复用性.稳定性和易维护性,我们针对PO模式进行了二次封装,将日志,等待以及异常截 ...
- web自动化针对PO模式进行二次封装之basepage
在PO模式当中,我们做到了页面对象与测试用例的分离,但在页面对象编写时,我们仍然还有优化的空间.页面对象有一些共同的基本操作,可以封装起来,并可以在基本操作当中加上日志和异常截图的处理.比如说我们在查 ...
- Python笔记_第四篇_高阶编程_二次封装
1.二次封装: 二次封装其实就是对一个类或者一个方法进行二次的改造增加新的功能. 2.一个类的二次封装: 我们以一个进程为例,我们把Process这个库进行二次封装,增加一些功能,在调用. thoma ...
- 二次封装Response类 | 视图类传递参数给序列化类context
二次封装Response类 源码: class Response(SimpleTemplateResponse): """ An HttpResponse that al ...
- DRF框架(五)——context传参,二次封装Response类,两个视图基类(APIView/GenericAPIView),视图扩展类(mixins),子类视图(工具视图),视图集(viewsets),工具视图集
复习 1.整体修改与局部修改 # 序列化get (给前端传递参数) #查询 ser_obj = ModelSerializer(model_obj) #只传递一个参数,默认是instance的参数,查 ...
- 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil
基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...
- python mysql redis mongodb selneium requests二次封装为什么大都是使用类的原因,一点见解
1.python mysql redis mongodb selneium requests举得这5个库里面的主要被用户使用的东西全都是面向对象的,包括requests.get函数是里面每次都是实例 ...
- 《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)
1.简介 上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试.宏哥将这个叫做浏览器引擎类.这个类负责获取浏览器类型和启动 ...
- FMDB 二次封装工具类,让你快速学会封装,集成数据库
来源:StrivEver 链接:http://www.jianshu.com/p/4c77aee0b41c 上个版本为了增加用户体验,部分页面集成了离线缓存数据功能,于是就在项目里使用了数据库管理离线 ...
随机推荐
- 【网站搭建】Docsify+Gittalk的配置过程记录分享。原创!
Gittalk 配置 这个不一定最先配置,我也不建议你最先配置这个,这个最好最后配置. 萌狼蓝天把这个的配置写在第一条,是因为我在这折腾了很久,就是因为网上抄来抄去的答案,除了迷惑萌狼蓝天难以给萌狼蓝 ...
- 【Rive】波动文字
1 前言 本文将使用文本修改器(Text Modifiers)做文字动画,实现文字波动效果. 按以下步骤可以创建一个 Modifier Group 和 Range. 部分参数的释义如下. ...
- 使用 IntelliJ IDEA 构建 Spring Framework 5.3.21 源码问题解决
源码版本 1.下载地址:https://github.com/spring-projects/spring-framework/tags 2.选择要构建的源码版本并下载,例如:5.3.21 相关环境 ...
- 如何设置AD域用户仅登录到指定的计算机?AD域管理软件
一 什么是AD域? 简单理解:Active Directory域内的directory database(目录数据库)是被用来存储用户账户.计算机账户.打印机和共享文件夹等对象,而提供目录服务的组件就 ...
- Qt开源作品36-程序守护进程
一.前言 没有任何人敢保证自己写的程序没有任何BUG,尤其是在商业项目中,程序量越大,复杂度越高,出错的概率越大,尤其是现场环境千差万别,和当初本地电脑测试环境很可能不一样,有很多特殊情况没有考虑到, ...
- [LC1161]最大层内元素和
题目概述 给你一个二叉树的根节点 root.设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推. 请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那 ...
- 在 ASP.NET Core WebAPI如何实现版本控制?
在 ASP.NET Core WebAPI 中实现版本控制(Versioning)是一种常见的做法,用于管理 API 的演进和兼容性.通过版本控制,我们可以在不破坏现有客户端的情况下引入新功能或修改现 ...
- mybatis中的数据源和连接池
1.核心配置文件中配置数据库相关属性 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE con ...
- IDEA 2020.3.2 安装激活教程
注意 本教程适用于 IntelliJ IDEA 2020.3.2 以下所有版本,请放心食用~ 本教程适用于 JetBrains 全系列产品,包括 Pycharm.IDEA.WebStorm.Phpst ...
- STL 容器操作
vector set转化为vector:vec.assign(set.begin(), set.end()) map 1. map默认从小到达排序,想要从大到小,可以: map<string, ...