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#实现接口xml序列化与反序列化的更多相关文章
- .NET中XML序列化和反序列化常用类和用来控制XML序列化的属性总结(XmlSerializer,XmlTypeAttribute,XmlElementAttribute,XmlAttributeAttribute,XmlArrayAttribute...)
序列化和反序列化是指什么? 序列化(seriallization): 将对象转化为便于传输的数据格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串.反序列化(deserial ...
- XML 序列化与反序列化
XML序列化与反序列化 1.将一个类转化为XML文件 /// <summary> /// 对象序列化成XML文件 /// </summary> /// <param na ...
- XmlSerializer 对象的Xml序列化和反序列化
http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...
- C#的XML序列化及反序列化
webservice在工作中用到的很多,基本都是以XML格式问通讯内容,其中最关键的就是XML串的序列化及反序列化. XML的运用中有两种信息传递,一种为XML的请求信息,另一种为返回信息,要运用XM ...
- .NET XML序列化与反序列化
闲着没事,写了两个通用的XML序列化与反序列化的方法. 贴出来当作笔记吧! /// <summary> /// XML序列化 /// </summary> /// <ty ...
- XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置
这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中 ...
- c# XML序列化与反序列化
c# XML序列化与反序列化 原先一直用BinaryFormatter来序列化挺好,可是最近发现在WinCE下是没有办法进行BinaryFormatter操作,很不爽,只能改成了BinaryWrite ...
- Xml序列化、反序列化帮助类
之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 /// <summary> / ...
- Windows phone 之XML序列化与反序列化
为什么要做序列化和反序列化? 一个回答: 我们都知道对象是不能在网络中直接传输的,不过还有补救的办法.XML(Extensible Markup Language)可扩展标记语言,本身就被设计用来存储 ...
随机推荐
- 前框 (一个)zTree 从数据库树形菜单动态加载
这些天做动态菜单使用此插件.现在有一个非常广泛的开源框架,最新QUI框架是菜单部分使用这个插件开发,因此,它是非常值获取深入的研究和探讨,通过使用非常丰富的感觉功能,己开发和编写,官网上有非常详尽的A ...
- 折返(Reentrancy)VS线程安全(Thread safety)
在Wiki上,折返例如,下面的定义(接) In computing, a computer program or subroutine is called reentrant if it can be ...
- ssh连接失败,排错经验(转)
一.场景描述 ssh连接服务器,发现连接失败,但是对应服务器的ip能够ping通. 场景: [root@yl-web ~]# ssh root@10.1.101.35 ssh_exchange_ide ...
- IE浏览器兼容性问题解决方法
如何用一行代码来解决CSS各种IE各种兼容性问题 一行代码来解决CSS在,IE6,IE7,IE8,IE9,IE10 各种兼容性问题. 在站点前端写代码的过程中,非常多时间IE各个版本号的兼容问题非常难 ...
- MapReduce 规划 系列十 采用HashPartitioner调整Reducer计算负荷
example4它演示了如何指定Reducer号码,本节演示如何使用HashPartitioner将Mapper根据该输出key分组后Reducer为了应对. 合理的分组策略会尽一切Reducer不能 ...
- android内置存储器memory和第三方外部存储disk管理
缓存管理这里 http://blog.csdn.net/intbird/article/details/38338713 图片处理在这里 http://blog.csdn.net/intbird/ar ...
- android变化HOLO对话风格
andriod风修改对话框格,通过设置theme实现.一些要素需要通过Java代码更改,下面的对话框更改的步骤的例子称号. 1.写文本样式. DIALOG标题是textview,在sytles.xml ...
- 很酷的CSS3仿Facebook登录表单
原文:很酷的CSS3仿Facebook登录表单 今天看到一款很不错的CSS3登录表单,外观是仿Facebook的登录表单,还挺不错的,另外也支持简单的表单输入框验证.下图是表单的效果图: 我们也可以在 ...
- [jQuery1.9]Cannot read property ‘msie’ of undefined错误的解决方法
原文:[jQuery1.9]Cannot read property 'msie' of undefined错误的解决方法 $.browser在jQuery1.9里被删除了,所以项目的js代码里用到$ ...
- 全网最全ASP.NET MVC 教程汇总
全网最全ASP.NET MVC 教程汇总 MVC架构已深得人心,微软也不甘落后,推出了Asp.net MVC.小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MV ...