2010-05-27 64 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