C# XML对象序列化反序列化 - PEPE YU

Posted chengjunde

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# XML对象序列化反序列化 - PEPE YU相关的知识,希望对你有一定的参考价值。

http://www.tuicool.com/articles/IjE7ban

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>

以上是关于C# XML对象序列化反序列化 - PEPE YU的主要内容,如果未能解决你的问题,请参考以下文章

如何将 XML 反序列化为 C# 中的对象? [复制]

在 C# 中为 WCF 服务反序列化简单的 XML 数组对象

在 C# 中使用派生类从 XML 反序列化对象

C# 在忽略命名空间的同时反序列化 xml

使用 C# Xml.Serialization 库反序列化每个重复的 XML 节点并将其映射到对象的属性

在C#中序列化和反序列化之间保留xml元素的顺序