DataContractSerializer生成没有子节点的XML,不保留任何数据

时间:2015-02-24 00:52:03

标签: c# xml serialization datacontractserializer

我一直在阅读StackOverflow,但最终遇到了互联网似乎没有现成答案的东西。在发现XMLSerializer无法序列化字典时,我切换到了DataContractSerializer。问题是,无论我如何处理它,序列化都会悄然失败。这就是我尝试序列化的内容。它是高度简化的(我试图缩小问题范围),但遭受与更复杂的前辈相同的疾病:

[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);
}

在查看Stackoverflow周围的类似问题(完全空输出,与我的不同)之后,我也试过了:

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的内容。加载它并对其执行操作将导致我的程序中发生各种不良事件。当它有一个命名空间时,情况并没有好转。有人有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您需要使用[DataMember]属性标记要序列化的属性。来自DataContractAttribute

的文档
  

将DataContractAttribute属性应用于DataContractSerializer在序列化和反序列化操作中使用的类型(类,结构或枚举)。

     

您还必须将DataMemberAttribute应用于包含要序列化的值的任何字段,属性或事件。通过应用DataContractAttribute,您可以显式启用DataContractSerializer来序列化和反序列化数据。

此外,如果您要序列化Dictionary<Enum1, List<string>>,则需要将enum Enum1标记为[DataContract](可能包含名称空间[DataContract(Namespace="")])并且每个enum成员[EnumMember]。更多信息:Enumeration Types in Data Contracts