C#序列化成XML注意細(xì)節(jié)
更新時(shí)間:2012年11月29日 11:48:48 作者:
最常用的序列化是把某個(gè)類序列化成二進(jìn)制文件.但有時(shí)我們也會(huì)把類序列化成xml文件,需要的朋友可以參考下
最常用的序列化是把某個(gè)類序列化成二進(jìn)制文件.但有時(shí)我們也會(huì)把類序列化成xml文件.
假如有如下一個(gè)類
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序列化成二進(jìn)制是一點(diǎn)問題都沒有.只在在前面用加個(gè)[Serializable]就行.另外如果類中還有字段或?qū)傩允穷惖脑捯惨谀莻€(gè)類相應(yīng)的類定義前面加[Serializable].如果類中的某個(gè)字段或?qū)傩圆幌氡恍蛄谢辉谠谒懊婕覽NonSerialized]即可. 序列化成二進(jìn)制相當(dāng)于把所有信息原封不動(dòng)保存到二進(jìn)制文件中.不管是private字段還是public的.也不管是啥類型的
而序列化成xml則相較序列化成二進(jìn)制受到很多限制,主要有三個(gè).
1是只能序列化public的字段或?qū)傩?
2是有些類型是不能序列化.比如上面的Hastable和TimeSpan這樣的類型.
3是類中必須有無參的構(gòu)造函數(shù)才能被序列化成xml.
那如果你實(shí)在想保存Hastable和TimeSpan這樣類型的信息時(shí)咋整啊?
那只能曲線救國了啊.中間做個(gè)轉(zhuǎn)換,先把Hastable 和Timespan轉(zhuǎn)換成其他類型.然后序列化成xml,反序列化回來的時(shí)候再轉(zhuǎn)換下.那也意味你要在原來的類中添加某個(gè)類型.比如新弄一個(gè)類pairs,有兩字段,對應(yīng)Hastable的鍵值對,然后用個(gè)List<pairs>把Hastable中所有信息保存起來.此時(shí)List<pairs>是可以被序列化的. 這顯然是個(gè)非常麻煩也非常笨的辦法.不過貌似沒更好的辦法啊.TimeSpan反正就可以先轉(zhuǎn)換成string類型了.
下面只說下xml轉(zhuǎn)換的簡單用法.像上面說的Hashtable等類型不能被序列化,那可以用個(gè)特性讓其顯式聲明為不可被序列化.用[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:\temp\arwen.xml";
XmlSerializer xs = new XmlSerializer(typeof(Arwen));
using (FileStream file = new FileStream(filename, FileMode.Create))
xs.Serialize(file, sa);
假如有如下一個(gè)類
復(fù)制代碼 代碼如下:
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序列化成二進(jìn)制是一點(diǎn)問題都沒有.只在在前面用加個(gè)[Serializable]就行.另外如果類中還有字段或?qū)傩允穷惖脑捯惨谀莻€(gè)類相應(yīng)的類定義前面加[Serializable].如果類中的某個(gè)字段或?qū)傩圆幌氡恍蛄谢辉谠谒懊婕覽NonSerialized]即可. 序列化成二進(jìn)制相當(dāng)于把所有信息原封不動(dòng)保存到二進(jìn)制文件中.不管是private字段還是public的.也不管是啥類型的
而序列化成xml則相較序列化成二進(jìn)制受到很多限制,主要有三個(gè).
1是只能序列化public的字段或?qū)傩?
2是有些類型是不能序列化.比如上面的Hastable和TimeSpan這樣的類型.
3是類中必須有無參的構(gòu)造函數(shù)才能被序列化成xml.
那如果你實(shí)在想保存Hastable和TimeSpan這樣類型的信息時(shí)咋整啊?
那只能曲線救國了啊.中間做個(gè)轉(zhuǎn)換,先把Hastable 和Timespan轉(zhuǎn)換成其他類型.然后序列化成xml,反序列化回來的時(shí)候再轉(zhuǎn)換下.那也意味你要在原來的類中添加某個(gè)類型.比如新弄一個(gè)類pairs,有兩字段,對應(yīng)Hastable的鍵值對,然后用個(gè)List<pairs>把Hastable中所有信息保存起來.此時(shí)List<pairs>是可以被序列化的. 這顯然是個(gè)非常麻煩也非常笨的辦法.不過貌似沒更好的辦法啊.TimeSpan反正就可以先轉(zhuǎn)換成string類型了.
下面只說下xml轉(zhuǎn)換的簡單用法.像上面說的Hashtable等類型不能被序列化,那可以用個(gè)特性讓其顯式聲明為不可被序列化.用[XmlIgnoreAttribute]即可
復(fù)制代碼 代碼如下:
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:\temp\arwen.xml";
XmlSerializer xs = new XmlSerializer(typeof(Arwen));
using (FileStream file = new FileStream(filename, FileMode.Create))
xs.Serialize(file, sa);
您可能感興趣的文章:
- C#復(fù)雜XML反序列化為實(shí)體對象兩種方式小結(jié)
- C# 解析XML和反序列化的示例
- C# 中對象序列化XML的方法
- 詳解 C# 中XML對象的序列化和反序列化
- C#中將xml文件反序列化為實(shí)例時(shí)采用基類還是派生類的知識(shí)點(diǎn)討論
- C#實(shí)現(xiàn)XML與實(shí)體類之間相互轉(zhuǎn)換的方法(序列化與反序列化)
- C# XML序列化方法及常用特性總結(jié)分析
- C#實(shí)現(xiàn)xml文件反序列化讀入數(shù)據(jù)到object的方法
- C#實(shí)現(xiàn)Xml序列化與反序列化的方法
- C#使用XML序列化操作菜單的方法
- C#實(shí)現(xiàn)對象XML序列化的方法
- C#實(shí)現(xiàn)復(fù)雜XML的序列化與反序列化
- c#正反序列化XML文件示例(xml序列化)
- C#實(shí)現(xiàn)XML序列化與反序列化
相關(guān)文章
C#向PPT文檔插入圖片以及導(dǎo)出圖片的實(shí)例
PowerPoint演示文稿是我們?nèi)粘9ぷ髦谐S玫霓k公軟件之一,本篇文章介紹了C#向PPT文檔插入圖片以及導(dǎo)出圖片的實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-12-12
C# ThreadPool之QueueUserWorkItem使用案例詳解
這篇文章主要介紹了C# ThreadPool之QueueUserWorkItem使用案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Unity實(shí)現(xiàn)攻擊范圍檢測并繪制檢測區(qū)域
這篇文章主要介紹了Unity實(shí)現(xiàn)攻擊范圍檢測并繪制檢測區(qū)域,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
基于Unity Line Renderer組件的常用屬性說明
這篇文章主要介紹了基于Unity Line Renderer組件的常用屬性說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

