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;
复制代码

 

posted @   HONT  阅读(4856)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
回到顶部