【问题标题】:DataContractSerializer produces XML with no child nodes, preserves no dataDataContractSerializer 生成没有子节点的 XML,不保留任何数据
【发布时间】:2015-02-24 00:52:03
【问题描述】:

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

【问题讨论】:

标签: c# xml serialization datacontractserializer


【解决方案1】:

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

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

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

另外,如果你想序列化你的Dictionary&lt;Enum1, List&lt;string&gt;&gt;,你需要用[DataContract]标记你的enum Enum1(可能用命名空间[DataContract(Namespace="")]),每个enum成员用[EnumMember]标记。更多信息:Enumeration Types in Data Contracts

【讨论】:

  • 哇,你们真快!非常感谢 - 我读到 [DataContract] 属性本身是可选的,所以我不会认为成员属性是必需的。出于某种原因,即使没有这些属性,我的枚举也能成功序列化。去图...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
相关资源
最近更新 更多