• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

.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;

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#同步方式实现SocketServer发布时间:2022-07-13
下一篇:
[转][C#]ZPL的调用发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap