栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

C#序列化成XML注意细节

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#序列化成XML注意细节

最常用的序列化是把某个类序列化成二进制文件.但有时我们也会把类序列化成xml文件.
假如有如下一个类
复制代码 代码如下:
class Arwen
{
private Hashtable table = new Hashtable();
private TimeSpan time = new TimeSpan(0, 0, 1);
public Hashtable Table
{
get { return table; }
set { table = value; }
}
public TimeSpan Time
{
get { return time; }
set { time = value; }
}
public string Name { get; set;}
}

如果你把上面的类Arwen序列化成二进制是一点问题都没有.只在在前面用加个[Serializable]就行.另外如果类中还有字段或属性是类的话也要在那个类相应的类定义前面加[Serializable].如果类中的某个字段或属性不想被序列化只在在它前面加[NonSerialized]即可. 序列化成二进制相当于把所有信息原封不动保存到二进制文件中.不管是private字段还是public的.也不管是啥类型的
而序列化成xml则相较序列化成二进制受到很多限制,主要有三个.
1是只能序列化public的字段或属性. 
2是有些类型是不能序列化.比如上面的Hastable和TimeSpan这样的类型.
3是类中必须有无参的构造函数才能被序列化成xml.
那如果你实在想保存Hastable和TimeSpan这样类型的信息时咋整啊?

那只能曲线救国了啊.中间做个转换,先把Hastable 和Timespan转换成其他类型.然后序列化成xml,反序列化回来的时候再转换下.那也意味你要在原来的类中添加某个类型.比如新弄一个类pairs,有两字段,对应Hastable的键值对,然后用个List把Hastable中所有信息保存起来.此时List是可以被序列化的. 这显然是个非常麻烦也非常笨的办法.不过貌似没更好的办法啊.TimeSpan反正就可以先转换成string类型了.

下面只说下xml转换的简单用法.像上面说的Hashtable等类型不能被序列化,那可以用个特性让其显式声明为不可被序列化.用[XmlIgnoreAttribute]即可
复制代码 代码如下:
using System.Xml.Serialization;
using System.IO;
class Arwen
{
private Hashtable table = new Hashtable();
private TimeSpan time = new TimeSpan(0, 0, 1);
public Arwen()
{
}
[XmlIgnoreAttribute]
public Hashtable Table
{
get { return table; }
set { table = value; }
}
[XmlIgnoreAttribute]
public TimeSpan Time
{
get { return time; }
set { time = value; }
}
}
Arwen weiwen = new Arwen();
weiwen.Time = new TimeSpan(1,2,3); // 1 hours , 2 minutes, 3 seconds
weiwen.Table.Add("arwen", 250);
string filename = @"c:temparwen.xml";
XmlSerializer xs = new XmlSerializer(typeof(Arwen));
using (FileStream file = new FileStream(filename, FileMode.Create))
xs.Serialize(file, sa);
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/127683.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号