2010-05-27 3 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; } 
     } 

일어나고 있지 않다, 나는 발견 IDictonary 직렬화 할 수없는 impelment 객체. 그러나 바이너리 직렬화로 성공했다.

하지만 xml을 갖고 싶습니다. 그렇게 할 방법이 있습니까? 나는 당신이 IXmlSerializable의 구현의 standart 해시 테이블에서 파생 된 자신의 해시 테이블을 만들 수 있습니다 C# 3.0

감사

답변

3

우선 C# 2.0부터 .NET 1.0에서 나온 매우 오래된 Hashtable의 유형 안전 버전을 사용할 수 있습니다. 따라서 Dictionary<DateTime, int>을 사용할 수 있습니다.

.NET 3.0부터는 DataContractSerializer을 사용할 수 있습니다.

[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 파일을 포함 : 그래서 당신은 당신이 다음과 같이 정의하면

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 유형을 다음과 같이 코드를 다시 작성할 수 있습니다

<?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 파일의 요소 이름을 모두 볼 수 있습니다. ee 정의.

1

을 사용하고

. 그래서 당신은 당신이 읽고 주어진 XmlReader를 & XmlWriter를 사용하여 Hashtablw에서 값을 작성하는 방법에 자신의 논리를 넣을 수 있습니다 되는 ReadXml (XmlReader를 리더) & 되는 WriteXml (XmlWriter를 작가) implmenent됩니다.

0

DataContractSerializer를 사용하면 더 강력하고 사용하기 쉽습니다.

+0

같은 간단한 샘플을 제공해 주시기 바랍니다. – Newbie