2010-05-27 66 views
3

嗨,我試圖序列哈希表,但沒有發生XML序列化(C#3.0)

private void Form1_Load(object sender, EventArgs e) 
     { 
      Hashtable ht = new Hashtable();   

      DateTime dt = DateTime.Now; 
      for (int i = 0; i < 10; i++) 
       ht.Add(dt.AddDays(i), i);   
      SerializeToXmlAsFile(typeof(Hashtable), ht); 
     } 

private void SerializeToXmlAsFile(Type targetType, Object targetObject) 
     { 
      try 
      { 
       string fileName = @"C:\output.xml"; 
       //Serialize to XML 
       XmlSerializer s = new XmlSerializer(targetType); 
       TextWriter w = new StreamWriter(fileName); 
       s.Serialize(w, targetObject); 
       w.Flush(); 
       w.Close(); 
      } 
      catch (Exception ex) { throw ex; } 
     } 

谷歌搜索後,我發現,impelment IDictonary不能被序列化對象。不過,我在二進制序列化方面取得了成功。

但我想有一個xml。有沒有這樣做的方法?

我使用C#3.0

感謝

回答

3

首先從C#2.0開始,您可以使用來自.NET 1.0的非常舊的Hashtable的類型安全版本。所以你可以使用Dictionary<DateTime, int>

從.NET 3.0開始,您可以使用DataContractSerializer。所以,你可以重寫你的代碼像下面

private void Form1_Load(object sender, EventArgs e) 
    { 
     MyHashtable ht = new MyHashtable();   

     DateTime dt = DateTime.Now; 
     for (int i = 0; i < 10; i++) 
      ht.Add(dt.AddDays(i), i);   
     SerializeToXmlAsFile(typeof(Hashtable), ht); 
    } 

其中SerializeToXmlAsFileMyHashtable類型定義類似以下內容:

[CollectionDataContract (Name = "AllMyHashtable", ItemName = "MyEntry", 
         KeyName = "MyDate", ValueName = "MyValue")] 
public class MyHashtable : Dictionary<DateTime, int> { } 

private void SerializeToXmlAsFile(Type targetType, Object targetObject) 
    { 
     try { 
      string fileName = @"C:\output.xml"; 
      DataContractSerializer s = new DataContractSerializer (targetType); 
      XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.Indent = true; 
      settings.IndentChars = (" "); 
      using (XmlWriter w = XmlWriter.Create (fileName, settings)) { 
       s.WriteObject (w, targetObject); 
       w.Flush(); 
      } 
     } 
     catch (Exception ex) { throw ex; } 
    } 

此代碼產生C:\的Output.xml文件有以下包含:

<?xml version="1.0" encoding="utf-8"?> 
<AllMyHashtable xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://schemas.datacontract.org/2004/07/DataContractXmlSerializer"> 
    <MyEntry> 
     <MyDate>2010-06-09T22:30:00.9474539+02:00</MyDate> 
     <MyValue>0</MyValue> 
    </MyEntry> 
    <MyEntry> 
     <MyDate>2010-06-10T22:30:00.9474539+02:00</MyDate> 
     <MyValue>1</MyValue> 
    </MyEntry> 
    <!-- ... --> 
</AllMyHashtable> 

那麼我們如何才能看到目標XML文件的所有元素的名稱,我們可以fr ee定義。

1

您可以從非標準Hashtable的衍生與實施IXmlSerializable的自己的哈希表。所以,你會implmenent 的ReadXml(XmlReader中讀取) & 中WriteXML(XmlWriter的作家)在那裏你可以把你自己的邏輯上如何查看自己Hashtablw給定的XmlReader &的XmlWriter寫入值。

0

我建議你使用DataContractSerializer,它更強大,更易於使用。

+0

你能否提供一個簡單的工作樣本 – Newbie 2010-05-28 02:44:57