最常用的序列化是把某個類序列化成二進位制檔案.但有時我們也會把類序列化成xml檔案.
假如有如下乙個類
class arwen
private hashtable table = new hashtable();
private timespan time = new timespan(0, 0, 1);
public hashtable table
get
set
public timespan time
get
set
public string name
如果你把上面的類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
set
[xmlignoreattribute]
public timespan time
get
set
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 序列化成XML注意事項
最常用的序列化是把某個類序列化成二進位制檔案.但有時我們也會把類序列化成xml檔案.假如有如下乙個類 class arwen set public timespan time set public string name 如果你把上面的類arwen序列化成二進位制是一點問題都沒有.只在在前面用加個 ...
序列化注意事項
1.在反序列化的時候必須得有對應的class檔案,否則丟擲classnotfoundexeception。2.序列化物件的直接或者間接父類要麼是能夠序列化的,要麼就得有無參的構造器,否則無法完成反序列化,丟擲invalidclas ception,對與無法序列化但是有無參構造器的情況,父類中的fil...
C 物件序列化成XML
public class xmlhelper using memorystream ms new memorystream return xmlstring xml string 反序列化成物件 public static t xmldeserialize string xmlstring retu...