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;

 

转载于:https://www.cnblogs.com/hont/p/4162448.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值