2012-03-02 49 views
4

每当我试图序列具有IEnumerable集合我得到一个大的脏错误告诉我,因为它是一个接口,它不能序列化对象。现在我明白为什么会发生这种情况,但它为我提出了一些其他问题。就像如果我打算在具有我的对象中集合,我想它们序列化,我需要诉诸C#Xml序列与IEnumerable的

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

什么是最好的做法的路要走?

回答

6

作为一个序列化作者,我确切地知道为什么它很难robustly只从IEnumerable<T>工作,特别是对于“只能获得”的属性。你可能尝试IList<T>(虽然它不会让我感到惊讶,如果它想要一个具体类型,如List<T>/T[]),但我怀疑这里真正的问题是,你试图用一个模型做两件事情,并不高兴必须妥协才能做到这一点。好的:如果你不想破坏你的域模型,可以写一个单独的 DTO模型,用于序列化,并且在它们之间映射。这通常是微不足道的,并且将允许序列化程序和领域模型各擅长于他们的一项工作。当您需要“版本化”系统或引入不同的序列化程序(JSON,protobuf等)时,它也将非常有用。

回复你的子弹:

  • 我怀疑与Add等任何具体的列表类型(甚至你自己)将工作
  • 我不建议任何人 - 这是痛苦的做可靠
  • 没有关于属性的丑陋;再次,我怀疑你的投诉是关于你的归属域模型 - 这样:很好,不用做 - 有一个独立的模型;你可以实际上在运行时做这一切,但它是更多的工作(见XmlAttributeOverrides,但要注意泄漏的程序集,如果你这样做)
  • 不要低估了多少工作,基础知识 - 诱人容易;但不平凡的场景可以是残酷
+0

你能ellaborate上系列化写一个单独的DTO?我从概念上知道DTO是什么,但它似乎基本上只是复制我的模型,这在我看来是错误的,因为它实际上意味着维护两个对象模型。 – David 2012-03-05 08:51:21

+0

@David拥有两个DTO的通用接口,减少重复。否则,如果可能的话,继续从主要的序列化。 – nawfal 2014-07-10 12:28:07

0

为了使用接口或derivade类必须使用XmlSerializer(类型类型,类型[] extraTypes)构造。

在extraTypes必须包括可以在你的类实现接口的所有可能的类。