zoukankan      html  css  js  c++  java
  • 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:UsersPEPEDesktop证据接口结构.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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    AC自动机
    KMP、扩展KMP、MANACHER
    Docker用户身份登录和管理员权限
    Response.Redirect和Server.Transfer比较--(转)
    SQLServer中char、varchar、nchar、nvarchar的区别--(转)
    MsSQL的字段类型--(转)
    读取UEditor编辑框内容到数据库和上传图片的配置
    以做产品的思想分析男女相处之道
    springBoot创建定时任务
    Runnable和Thread的区别
  • 原文地址:https://www.cnblogs.com/PEPE/p/3560377.html
Copyright © 2011-2022 走看看