2015-02-24 23 views
1

我一直在閱讀StackOverflow,但終於遇到了互聯網似乎沒有現有答案的東西。在發現XMLSerializer無法序列化字典後,我切換到了DataContractSerializer。問題是,無論我如何處理它,序列化都悄然失敗。以下是我想要序列化的內容。它是高度簡化的(我試圖縮小問題關閉),但來自同一個弊病遭受其更爲複雜的祖先:DataContractSerializer生成沒有子節點的XML,不保留數據

[DataContract(Namespace = "")] 
public class TestData 
{ 
    public Dictionary<Enum1, List<string>> List1 = new Dictionary<Enum1, List<string>>(); 

    public DateTime WeekStarting { get; private set; } 
    public DateTime LastSaved { get; set; } 
    public int Iteration { get; set; } 

    public string FilePath { get; private set; } 
    public string FileName { get; private set; } 

    public TestData() 
    { 
     FilePath = "C:/"; 
     FileName = "whatever.xml"; 

     foreach (var category in Enum.GetValues(typeof(Enum1)).Cast<Enum1>()) 
     { 
      List1.Add(category, new List<string>()); 
     } 

     LastSaved = DateTime.Now; 
     WeekStarting = DateTime.Now; 
     Iteration = 0; 
    } 
} 

我最初使用此代碼序列化嘗試:

var serializer = new DataContractSerializer(typeof(TestData)); 
using (var writer = new XmlTextWriter(File.CreateText(Path.Combine(CurrentWeek.FilePath, CurrentWeek.FileName)))) 
{ 
    writer.Formatting = Formatting.Indented; 
    serializer.WriteObject(writer, currentWeek); 
} 

看着周圍#2類似的問題(完全空輸出,不像我的)之後,我也試過這樣:

var serializer = new DataContractSerializer(typeof(TestData)); 
MemoryStream ms = new MemoryStream(); 
serializer.WriteObject(ms, CurrentWeek); 
ms.Position = 0; 

string serializedContent; 
using (StreamReader sr = new StreamReader(ms)) 
{ 
    serializedContent = sr.ReadToEnd(); 
} 

這:

var serializer = new DataContractSerializer(typeof(TestData)); 
using (var sw = new StringWriter()) 
{ 
    using (var writer = new XmlTextWriter(sw)) 
    { 
     writer.Formatting = Formatting.Indented; 
     serializer.WriteObject(writer, CurrentWeek); 
     writer.Flush(); 
     var xmlString = sw.ToString(); 
    } 
} 

所有這一切,只生產含此XML文件:

<TestData xmlns:i="http://www.w3.org/2001/XMLSchema-instance" /> 

...它包含的東西的XML,但基本上是空的,因爲它沒有任何序列TESTDATA的內容。加載它並對其執行操作會在我的程序中導致各種不好的事情發生。當它有一個命名空間的時候事情並沒有好轉。有人有主意嗎?

+0

標記您要序列化的屬性['[DataMember]'](https://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute%28v=vs.110%29的.aspx)。 – dbc 2015-02-24 00:58:49

回答

1

您需要使用[DataMember]屬性標記要序列化的屬性。從DataContractAttribute

的文檔應用DataContractAttribute屬性到在由DataContractSerializer的序列化和反序列化操作中使用的類型(類,結構,或枚舉)。

您還必須將DataMemberAttribute應用於包含要序列化值的任何字段,屬性或事件。通過應用DataContractAttribute,您可以顯式啓用DataContractSerializer以序列化和反序列化數據。

另外,如果你想你的序列化Dictionary<Enum1, List<string>>,你需要你的enum Enum1[DataContract]標記(可能與命名空間[DataContract(Namespace="")]),並與各[EnumMember]成員enum。更多這裏:Enumeration Types in Data Contracts

+0

哇,你們快!非常感謝你 - 我讀過[DataContract]屬性本身是可選的,所以我不會想到成員屬性是必需的。出於某種原因,我的枚舉成功序列化,即使沒有這些屬性。去搞清楚... – ZeeMox 2015-02-24 01:59:30