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

    C#实现接口xml序列化与反序列化

     

    C#中接口无法被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;
    复制代码
     
    分类: C# & .Net
  • 相关阅读:
    CodeForces Gym 100500A A. Poetry Challenge DFS
    CDOJ 486 Good Morning 傻逼题
    CDOJ 483 Data Structure Problem DFS
    CDOJ 482 Charitable Exchange bfs
    CDOJ 481 Apparent Magnitude 水题
    Codeforces Gym 100637G G. #TheDress 暴力
    Gym 100637F F. The Pool for Lucky Ones 暴力
    Codeforces Gym 100637B B. Lunch 找规律
    Codeforces Gym 100637A A. Nano alarm-clocks 前缀和
    TC SRM 663 div2 B AABB 逆推
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4163877.html
Copyright © 2011-2022 走看看