【问题标题】:How to Serialize a Dictionary<string,List<Custom Type>> to XML如何将 Dictionary<string,List<Custom Type>> 序列化为 XML
【发布时间】:2016-05-30 12:54:34
【问题描述】:

我有一个自定义类:

public class DicExpense
{
    [XmlElement]
    public string EmployeeName { get; set; }

    [XmlElement]
    public string Company { get; set; }        
}

我将其放入这样的字典中:

  var dict = new Dictionary<string, List<DicExpense>>();
  dict.Add("Expense1",new List<DicExpense>())
  dict["Expense1"].Add(new DicExpense() {EmployeeName = "Sam", Comment = "something"})
  dict["Expense1"].Add(new DicExpense() {EmployeeName = "Sam", Comment = "something"})


  dict.Add("Expense2",new List<DicExpense>())
  dict["Expense2"].Add(new DicExpense() {EmployeeName = "John", Comment = "something"})
  dict["Expense2"].Add(new DicExpense() {EmployeeName = "John", Comment = "something"})

我想将其序列化为 XML:

 <Expense>
 <key>Expense1</key>
 <EmployeeName>Sam</EmployeeName>
 <Comment>something</Comment>
 <EmployeeName>John</EmployeeName>
 <Comment>something</Comment>
 </Expense>

我正在尝试这个:

 StringBuilder output = new StringBuilder();
 var writer = new StringWriter(output);

 XmlSerializer serializer = new XmlSerializer(typeof(Dictionary<string,     List<DicExpense>>));
 serializer.Serialize(writer, records);
 Console.WriteLine(output);

但它不起作用。当您的值是自定义类型的集合时,有没有办法序列化它?

【问题讨论】:

  • 什么不起作用?您预期的 xml 正式文件将因多于 1 条记录而无效。
  • 这里你可以找到更多关于使用 XmlSerializer 序列化字典的细节stackoverflow.com/questions/495647/…

标签: c# xml linq dictionary


【解决方案1】:

如果要序列化/反序列化使用 Dictionary&lt;TKey, TValue&gt; 的类型,请使用 DataContractSerializer

 [DataContract(Name = "Expense")]
 public class DicExpense
 {       
    [DataMember]
    public string EmployeeName { get; set; }

    [DataMember(Order = 0)]
    public string Company { get; set; }
  }

 var dict = new Dictionary<string, List<DicExpense>>();
 dict.Add("Expense1", new List<DicExpense>());
 dict["Expense1"].AddRange(new List<DicExpense>
 {
    new  DicExpense()
    {
        EmployeeName = "Sam",
        Company = "company1"
    },
    new DicExpense()
    {
        EmployeeName = "John",
        Company = "company1"
    }
 });

 dict.Add("Expense2", new List<DicExpense>());
 dict["Expense2"].AddRange(new List<DicExpense>
 {
     new DicExpense()
     {
         EmployeeName = "Smith",
         Company = "company2"
      },
      new DicExpense()
      {
         EmployeeName = "John",
         Company = "company2"
      }
 });

 var serializer = new DataContractSerializer(typeof(Dictionary<string, List<DicExpense>>));
 using (var writer = XmlWriter.Create(Console.Out))
 {
      serializer.WriteObject(writer, dict);
 }

【讨论】:

  • 主要问题是字典不能在没有一些解决方法的情况下被序列化。泛型不是其背后的主要原因。 DataContractSerializer 也可能会失败。
  • @tdgtyugdyugdrugdr .. 已编辑
  • 谢谢@Mike Debela 这行得通,但输出有点复杂。
猜你喜欢
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多