gpt4 book ai didi

c# - 字典 X​​ML 序列化

转载 作者:行者123 更新时间:2023-11-30 12:09:40 30 4
gpt4 key购买 nike

我有一个带有字典属性的类,我想对其进行序列化。我读过不能直接序列化字典,所以我序列化/反序列化一个列表,然后转换为字典。它有效,但我想知道是否有适当的方法来做到这一点。

[Serializable]
public class Album
{

private List<Photo> photos = new List<Photo>();
[XmlArray]
public List<Photo> Photos
{
get { return photos; }
set
{
photos = value;
}
}

private Dictionary<string, Photo> dicoPhotos = new Dictionary<string, Photo>();
[XmlIgnore]
public Dictionary<string, Photo> DicoPhotos
{
get { return dicoPhotos; }
set { dicoPhotos = value; }
}


public void fillPhotosDictionnary()
{
this.dicoPhotos = this.photos.ToDictionary(p => p.Nom, p => p);
}
}

我已经尝试在 Photo 的 setter 中填充字典,但它不起作用,我也不知道为什么。

最佳答案

我建议利用 DataContractSerializer 及其关联的属性( DataContractDataMember )。它在 .NET 3.0+ 中可用。

它与 XmlSerializer 非常相似,但我发现它在一般序列化方面要好得多。此外,它还支持 Dictionary<TKey, TValue> 的序列化。开箱即用。

在您的情况下,将您的一些属性切换到适当的 DataContract 属性,然后使用 DataContractSerializer 而不是 XmlSerializer 应该是一件足够简单的事情。

最终输出将基本相同(一个 XML 文档),并且您的类中所需的代码更清晰。

[DataContract(Name = "Album", Namespace = "DataContracts")]
public class Album
{
[DataMember(Name = "DicoPhotos")]
private Dictionary<string, Photo> dicoPhotos = new Dictionary<string, Photo>();
public Dictionary<string, Photo> DicoPhotos
{
get { return dicoPhotos; }
set { dicoPhotos = value; }
}
}

DataContractSerializer 有一些技巧和陷阱:

  • 确保它知道您正在序列化的类型列表。
  • 确保所有内容都有适当的名称和命名空间(以保护您自己免受属性名称和命名空间更改的影响)。

如果您仅为非持久性目的(即通过电汇)进行序列化,请考虑使用 NetDataContractSerializer。如果您坚持使用任何类型的永久构造(如磁盘/数据库),请不要使用它,否则您以后可能会非常头疼(由于它的序列化方式)。

关于c# - 字典 X​​ML 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20787286/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com