C# XML对象序列化、反序列化
XML 序列化:可以将对象序列化为XML文件,或者将XML文件反序列化为对象还有种方法使用LINQ TO XML或者反序列化的方法从XML中读取数据。
最简单的方法就是.net framework提供的,只需要定义好xml数据格式,定义好对象即可。
1、调用方法:
using RenosData.RDBao.EvidenceUploadModel.Models; using RenosData.RDBao.EvidenceUploadModel.Parsers; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; using System.Xml.Serialization; namespace TestApplication { class Program { static void Main(string[] args) { string path = @"C:\Users\PEPE\Desktop\证据接口结构.xml"; FileStream stream = new FileStream(path, FileMode.Open); EvidenceFilesModel dep = (EvidenceFilesModel)XMLParser.Deserialize(typeof(EvidenceFilesModel), stream); stream.Close(); } } }
2、xml解析类
using RenosData.RDBao.EvidenceUploadModel.Models; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Serialization; namespace RenosData.RDBao.EvidenceUploadModel.Parsers { public class XMLParser { public T Deserialize<T>(T t, string s) { using (StringReader sr = new StringReader(s)) { XmlSerializer xz = new XmlSerializer(t.GetType()); return (T)xz.Deserialize(sr); } } public EvidenceFilesModel Convert(string xml) { //将xml反序列化成对象 EvidenceFilesModel b = new EvidenceFilesModel(); return Deserialize<EvidenceFilesModel>(b, xml); } #region 反序列化 /// <summary> /// 反序列化 /// </summary> /// <param name="type">类型</param> /// <param name="xml">XML字符串</param> /// <returns></returns> public static object Deserialize(Type type, string xml) { try { using (StringReader sr = new StringReader(xml)) { XmlSerializer xmldes = new XmlSerializer(type); return xmldes.Deserialize(sr); } } catch (Exception e) { return null; } } /// <summary> /// 反序列化 /// </summary> /// <param name="type"></param> /// <param name="xml"></param> /// <returns></returns> public static object Deserialize(Type type, Stream stream) { XmlSerializer xmldes = new XmlSerializer(type); return xmldes.Deserialize(stream); } #endregion #region 序列化XML文件 /// <summary> /// 序列化XML文件 /// </summary> /// <param name="type">类型</param> /// <param name="obj">对象</param> /// <returns></returns> public static string Serializer(Type type, object obj) { MemoryStream Stream = new MemoryStream(); //创建序列化对象 XmlSerializer xml = new XmlSerializer(type); try { //序列化对象 xml.Serialize(Stream, obj); } catch (InvalidOperationException) { throw; } Stream.Position = 0; StreamReader sr = new StreamReader(Stream); string str = sr.ReadToEnd(); return str; } #endregion } }
3、xml对象
根据xml定义的对象如下
eg 根目录类,其他的类就按xml格式一路下去
/// <summary> /// 证据接口结构模型 /// </summary> [Serializable] [XmlRoot("EvidenceFiles")] public class EvidenceFilesModel { /// <summary> /// 证据包信息 /// </summary> public EvidencePackageModel EvidencePackage { get; set; } /// <summary> /// 证据信息明细 /// </summary> [XmlArrayItem("Evidence")] public List<EvidenceModel> Evidences { get; set; } }
注意特性:[XmlArrayItem("Evidence")] 这个下面是会有多个分支
4、XML代码
<?xml version="1.0" encoding="utf-8"?> <EvidenceFiles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!--证据包信息--> <EvidencePackage> <Version>1.0</Version> <Package> <TrackNO>TrackNO</TrackNO> <Name>Name</Name> <Description> Description </Description> <ThumbFileName> ThumbFileName </ThumbFileName> <Time>2011-10-24T15:35:57</Time> </Package> <Integrity> <EvidenceCount>2</EvidenceCount> <EvidenceSize>1024</EvidenceSize> <Algorithm>MD5</Algorithm> <AlgorithmValue>算法的值</AlgorithmValue> </Integrity> <Owner> <Name>张三</Name> <Identity>编号</Identity> <Credentials>证件号</Credentials> </Owner> <GatherApp> <AppId>标识</AppId> <AppKey>验证码</AppKey> <Version>版本号</Version> </GatherApp> </EvidencePackage> <Evidences> <Evidence> <EvidenceMetaData> <EvidenceUser> <GatherUser> <Name>张三</Name> <Identity>编号</Identity> <Credentials>证件号</Credentials> </GatherUser> </EvidenceUser> <Environment> <CreateTime>2014-1-1T15:00:00</CreateTime> <Location>地点</Location> <GenerationMethod>成方式-</GenerationMethod> </Environment> <GatherApp> <AppName>系统名称</AppName> <Version>版本号</Version> </GatherApp> <Parser> <Encrypt> <Algorithm>算法</Algorithm> <AlgorithmVersion>版本号</AlgorithmVersion> </Encrypt> <ParserApp> <FileExtension>.doc</FileExtension> <FileType>类型</FileType> <AppName>名称</AppName> <AppVersion>版本</AppVersion> </ParserApp> </Parser> <SourceFile> <FileName>文件名</FileName> <CreateTime>2014-1-1T15:00:00</CreateTime> </SourceFile> </EvidenceMetaData> <Signature> <UserSignature> <Identity>账号</Identity> <Algorithm>签名算法</Algorithm> <SignKey>签名算法密钥</SignKey> <SignValue>签名的值</SignValue> </UserSignature> </Signature> </Evidence> <Evidence> <EvidenceMetaData> <EvidenceUser> <GatherUser> <Name>张三</Name> <Identity>编号</Identity> <Credentials>用户证件号</Credentials> </GatherUser> </EvidenceUser> <Environment> <CreateTime>2014-1-1T15:00:00</CreateTime> <Location>生成的地点</Location> <GenerationMethod>证据的生成方式</GenerationMethod> </Environment> <Parser> <Encrypt> <Algorithm>证据的加密算法</Algorithm> <AlgorithmVersion>版本号</AlgorithmVersion> </Encrypt> <ParserApp> <FileExtension>.doc</FileExtension> <FileType>文件类型</FileType> <AppName>解析的应用系统名称</AppName> <AppVersion>解析的应用系统版本号</AppVersion> </ParserApp> </Parser> <SourceFile> <FileName>1</FileName> <CreateTime>2014-1-1T15:00:00</CreateTime> </SourceFile> </EvidenceMetaData> <Signature> <UserSignature> <Identity>2</Identity> <Algorithm>22</Algorithm> <SignKey>33</SignKey> <SignValue>4</SignValue> </UserSignature> </Signature> </Evidence> </Evidences> </EvidenceFiles>
作者:PEPE
出处:http://pepe.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述