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

C#实现接口xml序列化与反序列化的更多相关文章

  1. .NET中XML序列化和反序列化常用类和用来控制XML序列化的属性总结(XmlSerializer,XmlTypeAttribute,XmlElementAttribute,XmlAttributeAttribute,XmlArrayAttribute...)

    序列化和反序列化是指什么? 序列化(seriallization): 将对象转化为便于传输的数据格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串.反序列化(deserial ...

  2. XML 序列化与反序列化

    XML序列化与反序列化 1.将一个类转化为XML文件 /// <summary> /// 对象序列化成XML文件 /// </summary> /// <param na ...

  3. XmlSerializer 对象的Xml序列化和反序列化

    http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...

  4. C#的XML序列化及反序列化

    webservice在工作中用到的很多,基本都是以XML格式问通讯内容,其中最关键的就是XML串的序列化及反序列化. XML的运用中有两种信息传递,一种为XML的请求信息,另一种为返回信息,要运用XM ...

  5. .NET XML序列化与反序列化

    闲着没事,写了两个通用的XML序列化与反序列化的方法. 贴出来当作笔记吧! /// <summary> /// XML序列化 /// </summary> /// <ty ...

  6. XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置

    这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间.   为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中 ...

  7. c# XML序列化与反序列化

    c# XML序列化与反序列化 原先一直用BinaryFormatter来序列化挺好,可是最近发现在WinCE下是没有办法进行BinaryFormatter操作,很不爽,只能改成了BinaryWrite ...

  8. Xml序列化、反序列化帮助类

    之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 /// <summary> / ...

  9. Windows phone 之XML序列化与反序列化

    为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...

随机推荐

  1. 024找到二维阵列(keep it up)

    剑指offer在标题中:http://ac.jobdu.com/problem.php? pid=1384 题目描写叙述: 在一个二维数组中,每一行都依照从左到右递增的顺序排序.每一列都依照从上到下递 ...

  2. [搜索] hdu 4016 Magic Bitwise And Operation

    主题链接: http://acm.hdu.edu.cn/showproblem.php?pid=4016 Magic Bitwise And Operation Time Limit: 6000/30 ...

  3. 应用spss可靠性分析软件

    问卷调查的可靠性分析 一.概念:     信度是指依据測验工具所得到的结果的一致性或稳定性,反映被測特征真实程度的指标. 一般而言,两次或两个測验的结果愈是一致.则误差愈小,所得的信度愈高,它具有下面 ...

  4. SharePoint 2013 中将 HTML文件转换为母版页

    原文:SharePoint 2013 中将 HTML文件转换为母版页 SharePoint 2013提供了很多新功能,下面我们看看将Html页面,转换为母版页的功能.这个功能更加方便设计人员设计母版页 ...

  5. NSIS:在线下载并安装程序

    原文 NSIS:在线下载并安装程序 看到有同学留言说需要这方面的代码,所以贴出以下代码供参考(非完整脚本).需要用NSISdl插件. Section -.NET Framework    NSISdl ...

  6. 深和学习导航CSS样式

    一个很容易理解,具体导航栏CSS授课风格 诚奉献给朋友: 原文地址:点击这里.

  7. listener.ora中PLSExtPro 和ExtProc的作用(转)

    默认安装时,会安装一个PL/SQL外部程序(ExtProc)条目在listener.ora中,是oracle为调用外部程序默认配置的监听,它的名字通常是ExtProc或PLSExtProc,但一般不会 ...

  8. Visual Studio Code开发TypeScript

    [Tool] 使用Visual Studio Code开发TypeScript   [Tool] 使用Visual Studio Code开发TypeScript 注意 依照本篇操作步骤实作,就可以在 ...

  9. MVC 编程模型及其变种

    MVC 编程模型及其变种 MVC全称是Model View Controller, 这是一个模型(model)-查看(view)-调节器(controller)缩写,这是通过通用的编程模型非.MVC当 ...

  10. Android dumpsys命令的使用

    Android提供的dumpsys工具能够用于查看手机中的应用程序和系统服务信息与状态,手机连接电脑后能够直接命令行运行adb shell dumpsys 查看全部支持的Service可是这样输出的太 ...