zoukankan      html  css  js  c++  java
  • C#实现接口xml序列化与反序列化

    .net中接口无法被xml序列化,提示不支持。百度和bing也搜不到,只好自己动手写了

    原理上肯定支持,.Net自己的xml序列化有一个IXmlSerializable接口。

    自行实现该接口,并取得类名,再进行自定义的序列化处理即可。

    using System.Collections;
    using System.Xml.Serialization;
    using System;
    using System.Xml;
    
    [XmlRoot("SerInterface"), Serializable]
    public class SerInterface<TInterface> : IXmlSerializable
    {
        public TInterface Source { get { return (TInterface)mSource; } }
        string mTypeName;
        object mSource;
    
    
        public SerInterface()
        {
    
        }
    
        public SerInterface(object interfaceObj)
        {
            this.mSource = interfaceObj;
            mTypeName = mSource.GetType().FullName;
        }
    
        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }
    
        public void ReadXml(XmlReader reader)
        {
            var typeSer = new XmlSerializer(typeof(string));
            bool wasEmpty = reader.IsEmptyElement;
            reader.Read();
    
            if (wasEmpty)
                return;
            while (reader.NodeType != XmlNodeType.EndElement)
            {
                reader.ReadStartElement("Type");
                mTypeName = typeSer.Deserialize(reader) as string;
    
                reader.ReadEndElement();
    
                var sourceSer = new XmlSerializer(Type.GetType(mTypeName));
                reader.ReadStartElement("Object");
                mSource = sourceSer.Deserialize(reader);
                reader.ReadEndElement();
                reader.MoveToContent();
            }
            reader.ReadEndElement();
        }
    
        public void WriteXml(XmlWriter writer)
        {
            var typeSer = new XmlSerializer(typeof(string));
            var sourceSer = new XmlSerializer(mSource.GetType());
    
            writer.WriteStartElement("Type");
            typeSer.Serialize(writer, mTypeName);
            writer.WriteEndElement();
            writer.WriteStartElement("Object");
            sourceSer.Serialize(writer, mSource);
            writer.WriteEndElement();
        }
    }

    使用:

    //把接口嵌套
    IXXX tmp = new Class1();
    var serInterface = new SerInterface<IXXX>(tmp);
    
    
    //序列化
    var xmlSer = new XmlSerializer(serInterface.GetType());
    var writer = new MemoryStream();
    
    xmlSer.Serialize(writer, serInterface);
    
    StreamReader sr = new StreamReader(writer);
    var serStr = Encoding.UTF8.GetString(writer.ToArray());
    
    writer.Flush();
    writer.Close();
    sr.Close();
    
    
    //反序列化
    xmlSer = new XmlSerializer(typeof(SerInterface<IXXX>));
    TextReader reader = new StringReader(serStr);
    var deSer =  xmlSer.Deserialize(reader);
    
    //原始数据
    var sourceInterfaceData = (deSer as SerInterface<IXXX>).Source;
  • 相关阅读:
    线性代数:矩阵行列式
    线性代数:逆变换
    线性代数:线性变换
    线性代数:零空间
    线性代数:向量乘法
    线性代数基础:向量组合
    线性代基础理论:向量
    线性代基础理论:矩阵
    SpringBoot 消费NSQ消息
    将Oracle中的数据放入elasticsearch
  • 原文地址:https://www.cnblogs.com/hont/p/4162448.html
Copyright © 2011-2022 走看看