2015-02-24 61 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