XML序列化与反序列化

C#对于XML的序列化与反序列化提供了很好的支持,我们只需要引用System.Xml的命名空间即可,无需使用第三方库,下面简单实现了一个XML的序列化与反序列化的帮助类。

1.序列化:

先声明一个变量var settings = new XmlWriterSettings,分别设置两个属性Encoding = new UTF8Encoding(false)和 Indent = true。第一个从字面意思即可知道是设置要使用的文本编码的类型,但为什么这里没有使用默认的Encoding.UTF8呢,这是因为如果用Encoding.UTF8将在输出文本的最前面添加4个字节的非xml内容。Indent属性表示是否缩进元素。第二点需要注意的是XmlSerializerNamespaces这里,var ns声明一个变量并添加空元素的意义在于强制指定命名空间,覆盖默认的命名空间

2.反序列化:

反序列化相对来说就比较简单了,IsNullOrEmpty的意义在于当传入的字符串是null或者空时函数就返回true,否则返回false。可以参看源码的实现

public static bool IsNullOrEmpty(string value){ return value == null || value.Length == 0; } 

其它的就参看源码吧。

 1 using System;
 2 using System.IO;
 3 using System.Text;
 4 using System.Xml;
 5 using System.Xml.Serialization;
 6 
 7 namespace XmlHelper
 8 {
 9     public static class XmlSerializeHelper
10     {
11         /// <summary>
12         /// XML序列化
13         /// </summary>
14         /// <typeparam name="T"></typeparam>
15         /// <param name="obj"></param>
16         /// <returns></returns>
17         public static string XmlSerializer<T>(T obj)
18         {          
19             var settings = new XmlWriterSettings
20             {
21                 Encoding = new UTF8Encoding(false),
22                 Indent = true
23             };
24 
25             using (var ms = new MemoryStream())
26             {                           
27                 using (var xw = XmlWriter.Create(ms, settings))
28                 {
29                     var ns = new XmlSerializerNamespaces();
30                     ns.Add("", "");
31                     var serializer = new XmlSerializer(obj.GetType());
32                     serializer.Serialize(xw, obj, ns);
33                     return Encoding.UTF8.GetString(ms.ToArray());
34                 }
35             }
36         }
37 
38         /// <summary>
39         /// XML反序列化
40         /// </summary>
41         /// <typeparam name="T"></typeparam>
42         /// <param name="XmlString"></param>
43         /// <returns></returns>
44         public static T XmlDeserialize<T>(this string XmlString)
45         {
46             if (string.IsNullOrEmpty(XmlString))
47                 throw new ArgumentNullException("s");         
48 
49             using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(XmlString)))
50             {
51                 using (var xr = XmlReader.Create(ms))
52                 {
53                     var xmlSerializer = new XmlSerializer(typeof(T));
54                     return (T)xmlSerializer.Deserialize(xr);
55                 }
56             }
57         }
58 
59         /// <summary>
60         /// XML保存到本地
61         /// </summary>
62         /// <param name="strXml"></param>
63         /// <returns></returns>
64         public static void SavaToFile(string strXml)
65         {
66             string filepath = "d:\\Log\\";
67             if (!Directory.Exists(filepath))
68                 Directory.CreateDirectory(filepath);
69 
70             string fileName = DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xml";
71             using (FileStream fs = new FileStream(filepath + fileName, FileMode.Create))
72             {
73                 byte[] xmlBytes = Encoding.UTF8.GetBytes(strXml);
74                 fs.Write(xmlBytes, 0, xmlBytes.Length);
75             }
76         }
77     }
78 }

 

转载于:https://www.cnblogs.com/sunwenqi/p/11044009.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CODE[VS] 3411 洪水

题目描述 Description小浣熊松松和朋友到野外露营&#xff0c;没想到遇上了&pi;年一次的大洪水&#xff0c;好在松松是一只爱观察的小浣熊&#xff0c;他发现露营地的地形和洪水有如下性质&#xff1a; ①露营地可以被看做是一个N*M的矩形方阵&#xff0c;其中左上角坐标为…

JavaScript --- 取得鼠标事件的坐标

说明: clientX和clientY属性&#xff1a;事件发生时,鼠标指针在视口中的水平和垂直坐标。pageX和pageY属性&#xff1a;鼠标光标在页面中的位置。screenX和screenY属性&#xff1a;鼠标事件发生时&#xff0c;鼠标指针相对于整个屏幕的坐标信息。IE8及更早的版本不支持事件对象…

JavaScript语义基础

变量&#xff08;Variables&#xff09; Variables是你存储数据的容器。声明一个变量需要使用关键字var&#xff0c;然后输入变量的名称。 1 var myvar; 定义一个变量后&#xff0c;可以赋予变量一个值&#xff1a; 1 myvar "mxp"; 可以将上述操作写在一行&#x…

spring面试专题一点通,再也不用担心面试不会回答了

前言文章内容有点小长&#xff0c;希望你能耐心阅读&#xff0c;更多Java面试题以及学习资料获取方式&#xff1a;加Qun:1017-599-436免费获取。还有更多包括电子书&#xff0c;PDF文档以及视频精讲可以分享给大家&#xff0c;内容覆盖很广&#xff0c;分布式缓存、RPC 调用、Z…

bzoj4033 [HAOI2015]树上染色

题目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id4033 重要的思路&#xff1a;与其考虑每一个点对的贡献&#xff0c;不如考虑每条边的贡献&#xff08;被经过了几次&#xff09;&#xff01; 树形dp。 总共的黑点和白点的个数都是已知的&#xff0c;所以知…

JavaScript --- 表单focus,blur,change事件的实现

假设有一个文本框&#xff0c;我们只允许用户输入数值。为此&#xff0c;我们希望: 1.利用focus事件修改文本框内容&#xff0c; 2.利用blur事件回复文本框的内容, 3.利用change事件在用户输入了非数值字符时再次修改背景颜色。 var EventUtil {addHandler: function(element…

mysql日期格式转化

select DATE_FORMAT( 20170701, %Y-%m-%d);先挖坑转载于:https://www.cnblogs.com/tuhooo/p/7766221.html

Solr管理页面 上

DashBoard&#xff08;仪表盘&#xff09;Logging&#xff08;日志&#xff09;Core Admin&#xff08;Core管理&#xff09;在Solr中&#xff0c;每一个Core&#xff0c;代表一个索引库&#xff0c;里面包含索引数据及其配置信息。Solr中可以拥有多个Core&#xff0c;也就同时…

GRPC协议的相关原理

GRPC的Client与Server&#xff0c;均通过Netty Channel作为数据通信&#xff0c;序列化、反序列化则使用Protobuf&#xff0c;每个请求都将被封装成HTTP2的Stream&#xff0c;在整个生命周期中&#xff0c;客户端Channel应该保持长连接&#xff0c;而不是每次调用重新创建Chann…

Echarts --- 各个省份的坐标

纯手打…效果如下 1.新疆: [86.61 , 40.79] 2.西藏:[89.13 , 30.66] 3.黑龙江:[128.34 , 47.05] 4.吉林:[126.32 , 43.38] 5.辽宁:[123.42 , 41.29] 6.内蒙古:[112.17 , 42.81] 7.北京:[116.40 , 40.40 ] 8.宁夏:[106.27 , 36.76] 9.山西:[111.95,37.65] 10.河北:[115.21 , 38.…

xxx征集系统项目目标文档

问题 每四人一组&#xff0c;讨论结束后&#xff0c;每人根据课堂讨论结果提交一份系统利益相关者案例。撰写撰写项目目标文档&#xff08;目标&#xff0c;好处&#xff0c;度量标准。&#xff09; 项目目标文档 目标&#xff1a; &#xff08;1&#xff09;需求填报 &#xf…

高并发大流量专题---10、MySQL数据库层的优化

高并发大流量专题---10、MySQL数据库层的优化 一、总结 一句话总结&#xff1a; mysql先考虑做分布式缓存&#xff0c;过了缓存后就做mysql数据库层面的优化 1、mysql数据库层的优化的前面一层是什么&#xff1f; 数据库缓存&#xff1a;突破了数据库缓存就需要做mysql数据库层…

【彩彩只能变身队】后端工作总结

2018.06.09 早上8点到晚上10点 冲刺前后端交互(vueexpressmysql) 8&#xff1a;00-12&#xff1a;00 &#xff1a; 前端把请求写好&#xff1a; <template> <div class"LoginForm"> <el-form ref"form" label-width"80px"…

web安全

web安全 DOS命令 web攻防必备课笔记 慕课xss学习 阮一峰&#xff1a;MVC、MVP和MVVM的图示转载于:https://www.cnblogs.com/hanxuming/p/7774092.html

JavaScript --- 渲染数据量大的数组

很多时候&#xff0c;需要在页面上展示从后台来的大量数据,如果一次性渲染&#xff0c;会影响用户的体验。(而且浏览器中的JS严格限制了资源) /* *使用分组的思想来渲染大量的数组 *parmas array 要处理的数组 *params process 对数组中每一个item进行的操作 *parmas context …

Jquery操作select小结

每次操作select都要查资料&#xff0c;干脆总结一下。 为select设置placeholder <select class"form-control selOP" placeholder"Pick Orchestration Plan"><option value"" disabled selected styledisplay:none;>Pick Orchestrat…

第六讲:PrintClient工具的使用

一些简单命令&#xff1a; cp -rf 源目录 目的目录 chmod -R 777 文件名 motelist 查看节点路径 make telosb 编译代码 make telosb reinstall 下载但不编译 make telosb install 编译并且下载 make telosb install, 2 bsl,/dev/ttyUSB0 下载指定路径 java net.tinyos.tools.Li…

SQL Server

查看数据库服务器名称&#xff1a;tracert 192.168.10.01 转载于:https://www.cnblogs.com/hongwei2085/p/9174760.html

css --- 选择器

标签选择器 // 标签选择器是最简单的选择器, 它的命名只要和对应的HTML标签相同即可 h1 {font-size: 30px;color: #333; }类选择器 // 类选择器也称为class选择器,它的语法非常简单,在class名称前面加上一个"."符号 <div class"red content"></…

C++标准输入流、输出流以及文件流

1、流的控制 iomanip 在使用格式化I/O时应包含此头文件。 stdiostream 用于混合使用C和C 的I/O机制时&#xff0c;例如想将C程序转变为C程序 2、类继承关系 ios是抽象基类&#xff0c;由它派生出istream类和ostream类&#xff0c; iostream类支持输入输出操作&…