用IEnumerable对C#Xml序列化对象

Dav*_*vid 4 c# ienumerable xml-serialization

每当我尝试序列化具有IEnumerable集合的对象时,我都会遇到一个很大的错误,告诉我它无法序列化它,因为它是一个接口.现在我知道它为什么会发生,但它为我提出了一些其他问题.就像我打算在我的对象中拥有集合并且我想序列化它们,我需要求助于

  1. 在我的对象中使用List <>,CollectionBase,ReadOnlyCollectionBase.
  2. 使我的对象实现IXmlSerializable接口.
  3. 用可怕的属性装饰我的课程.
  4. 编写自己的序列化程序.

什么是最好的练习方式?

Mar*_*ell 6

作为一个序列化作者,我确切地知道为什么它变得非常难以稳健地工作IEnumerable<T>,特别是对于"只获取"属性.你可能会尝试IList<T>(虽然如果它想要一个像List<T>/ 这样的具体类型会让我感到惊讶T[],但我怀疑这里真正的问题是你试图用一个模型做两件事,并且不满意不得不妥协到做到这一点.

好的:如果您不想破坏您的域模型,请编写一个用于序列化的单独 DTO模型,并在它们之间进行映射.这通常是微不足道的,并且允许序列化器和域模型在每个工作中都表现出色.当你需要"版本化"系统或引入不同的序列化程序(JSON,protobuf等)时,它也会有很大的帮助.

你的子弹:

  • 我怀疑任何具体的列表类型(甚至是你自己的)Add都可以使用
  • 我不建议任何人 - 可靠地做是痛苦的
  • 关于属性没什么好看的; 再次,我怀疑你的投诉是关于归因于你的域名模型 - 所以:好的,不要这样做 - 有一个单独的模型; 你可以在运行时实际完成所有这些工作,但它还有更多工作XmlAttributeOverrides要做(参见,但要注意泄漏的程序集,如果你这样做)
  • 不要低估这是多少工作; 基础知识 - 诱人的容易; 但非平凡的情景可能是残酷的