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